像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