2012-07-25 116 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++中执行此操作,可以使用指向实际对象的指针或引用。

相关问题