像Java和C#一樣,我可以在同一個類中創建一個類的對象嗎?在同一個類中創建一個類的對象時出現C++錯誤?
/* State.h */
class State{
private:
/*...*/
State PrevState;
};
錯誤:
field 'PrevState' has incomplete type
像Java和C#一樣,我可以在同一個類中創建一個類的對象嗎?在同一個類中創建一個類的對象時出現C++錯誤?
/* State.h */
class State{
private:
/*...*/
State PrevState;
};
錯誤:
field 'PrevState' has incomplete type
書面你不能做到這一點。當您直接在類中聲明某個變量類型(Type variablename
)時,變量分配的內存將成爲其父類型分配的一部分。知道了這一點,它變得很清楚爲什麼你不能這樣做:分配將遞歸地擴展 - PrevState
將需要分配空間它的PrevState
成員,等等永遠。而且,即使可以用這種方式分配無限量的內存,構造函數調用也會無限遞歸。
可以,但是,定義一個變量,它是引用或指針包含類型,無論是State &
或State *
(或一些智能指針型),因爲這些類型的大小是固定的(參考文獻都通常指針大小,指針可以是4或8個字節,具體取決於你的體系結構)。
你錯了State PrevState
和State* PrevState
。問題的原因是,你認爲C++是什麼的,所有的都像Java和C#。事實並非如此。你需要花一些時間來刷新你的C++。
So why can you do this in C# and Java, but you cannot do this in C++?
在C++中,對象可以包含子對象。這意味着子對象的內存將成爲包含它的對象的一部分。但是,在C#和Java中,對象不能有子對象,當你使用其中一種語言執行State PrevState;
時,內存駐留在容器外部的其他外部,並且只對該類中的實際對象持有「引用」。要在C++中執行此操作,可以使用指向實際對象的指針或引用。
你不能那樣做。你可以做的最好的是'State * PrevState;'。 – Mysticial 2012-07-25 02:57:50
這樣的對象需要無限量的內存和無限的時間來初始化。 – porges 2012-07-25 02:59:31
如果你熟悉C#,上面的代碼更接近'public struct State {public State nextState; }'。 C++是一種具有值語義的語言,您必須明確請求引用語義(通過指針/引用) – 2012-07-25 03:05:01