2012-07-25 84 views
1

像Java和C#一樣,我可以在同一個類中創建一個類的對象嗎?在同一個類中創建一個類的對象時出現C++錯誤?

/* State.h */ 
class State{ 
    private: 
    /*...*/ 
    State PrevState; 
}; 

錯誤:

field 'PrevState' has incomplete type 
+5

你不能那樣做。你可以做的最好的是'State * PrevState;'。 – Mysticial 2012-07-25 02:57:50

+2

這樣的對象需要無限量的內存和無限的時間來初始化。 – porges 2012-07-25 02:59:31

+2

如果你熟悉C#,上面的代碼更接近'public struct State {public State nextState; }'。 C++是一種具有值語義的語言,您必須明確請求引用語義(通過指針/引用) – 2012-07-25 03:05:01

回答

3

書面你不能做到這一點。當您直接在類中聲明某個變量類型(Type variablename)時,變量分配的內存將成爲其父類型分配的一部分。知道了這一點,它變得很清楚爲什麼你不能這樣做:分配將遞歸地擴展 - PrevState將需要分配空間它的PrevState成員,等等永遠。而且,即使可以用這種方式分配無限量的內存,構造函數調用也會無限遞歸。

可以,但是,定義一個變量,它是引用或指針包含類型,無論是State &State *(或一些智能指針型),因爲這些類型的大小是固定的(參考文獻都通常指針大小,指針可以是4或8個字節,具體取決於你的體系結構)。

1

你錯了State PrevStateState* PrevState。問題的原因是,你認爲C++是什麼的,所有的都像Java和C#。事實並非如此。你需要花一些時間來刷新你的C++。

1

So why can you do this in C# and Java, but you cannot do this in C++?

在C++中,對象可以包含子對象。這意味着子對象的內存將成爲包含它的對象的一部分。但是,在C#和Java中,對象不能有子對象,當你使用其中一種語言執行State PrevState;時,內存駐留在容器外部的其他外部,並且只對該類中的實際對象持有「引用」。要在C++中執行此操作,可以使用指向實際對象的指針或引用。

相關問題