2014-04-19 104 views
1

我想創建一個具有它自己的類型的變量,並遇到問題的類。這是我想要做什麼:C++如何創建一個類使用它自己的類型的變量

Class myClass 
{ 
    private: 
     myClass a, b; 
    public: 
     void myFunctionA() 
     { 
      SomeOtherClass.somePointerToMap = &a; 
     } 

     void myFunctionB() 
     { 
      SomeOtherClass.somePointerToMap = &b; 
     } 
}; 

任何幫助表示讚賞,它是一個基於文本的遊戲,需要的if語句來移動玩家如果我不能得到這個工作100的。

+2

你不能做到這一點。回頭一步,詳細描述這個問題的解決方法,也許我們可以幫助你解決這個問題。 –

+0

關於來自@BenjaminLindley的評論,您可能想了解[XY問題](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)。 –

+0

即使是1棟房屋也不可能。編譯器是否可以爲足夠大的房子預留足夠的內存用於Jack以及另一個足夠大的Jack,再加上另一個足夠大的Jack,再加上另一個足夠大的Jack,再加上另一個足夠大的房子傑克再加上另一棟足夠大的房子,再加上另一棟足以容納傑克的房子,再加上另一棟足以容納傑克的房子,再加上另一棟足夠大的房子,再加上另一棟足夠大的傑克加上另一棟房子,對傑克再加上另一棟房子足夠大...? – fredoverflow

回答

0

你需要一個向前聲明和表示遞歸式將不得不使用指針類:

class myClass 
{ 
private: 
    myClass* a; 
    myClass* b; 
+1

我不知道你怎麼可能有足夠的信息知道這是他的問題的解決方案。 –

+0

@laune我討厭有激情的指針:(謝謝雖然 – Shadow

+1

@BenjaminLindley意圖很明確:建立一個遞歸數據結構,我的建議是最有可能實現的方式 – laune

3

你不能這樣做,因爲有一個類型的實例

1)條規定,型號齊全,並且類是其定義的右括號後才能完成。

2)一個擁有自身實例的類將是無限大的。

您需要存儲指針或對myClass的引用。

+0

所以在'私人:'我需要這樣去: – Shadow

+0

'myClass * a,* b;'? – Shadow

1

類的大小至少是一個字節。

但是,如果一個類包含它自己的兩個副本,那麼它必須至少有兩個字節。

但是,如果它至少有兩個字節(並且包含它自己的兩個副本),那麼它必須至少有四個字節。

但是,如果它至少有四個字節(並且包含它自己的兩個副本),那麼它必須至少有八個字節。

...等等... :-)

你可以有一個包含兩個引用同一個類的實例的類:

struct X { 
    int x; 
    X &a, &b; 
    X(int x, X& a, X& b) : x(x), a(a), b(b) {} 
}; 

建設的第一個實例是不平凡因爲引用必須在構造函數中設置,並且以後不能更改。仍然有可能建立一些掛羊頭賣狗肉網絡......例如

extern X x1; 
extern X x2; 
extern X x3; 

X x1(1, x2, x3); 
X x2(2, x3, x1); 
X x3(3, x1, x2); 

x1.a.b.a.a.b.b.a.b.a.a.a.b.a.x後1

你終於可以有一個包含指向同一個類的實例類。這是一個相當常見的模式(例如,用於二叉樹):

struct Node { 
    int value; 
    Node *left, *right; 
    Node(int value, Node *left, Node *right) 
     : value(value), left(left), right(right) 
    {} 
}; 

與指針的好處是,你不會強迫指定實例(可以使用空指針來代替),而你也可以稍後更改指針指向的內容。不幸的是,語法有點煩人(需要->)。

另外一個非常容易的選擇(但它僅適用於樹木,而不是任意拓撲結構)是包含同一個類的實例的容器類,例如:

struct Node { 
    int x; 
    std::vector<Node> children; 
    Node(int x) : x(x) {} 
}; 

這工作,因爲children容器也可能是空的(所以大小不會爆炸到無窮大),並在內部使用指針進行管理。

0

如果你想創建它自己的類型的變量,你只能創建指針。普通變量(非指針)是完整類型,不能在「自己的類型」中創建。指針是不完整的類型。

所以下面是允許的,

Class myClass 
{ 
    private: 
     myClass *a, *b;//incomplete type 
.... 
} 

但是,這是不可能的,

Class myClass 
    { 
     private: 
      myClass a, b;//complete type 
    .... 
    } 
+1

任何指針(甚至是指向前向聲明的類)是一個有效的完整類型 –

+0

沒有指針是不完整的類型,你可以參考http://msdn.microsoft.com/en-us/library/200xfxh6.aspx –

+0

並且在那個鏈接的地方它說,指針是不完整的類型? – jrok

相關問題