像 Java 和 C# 一样,我可以在同一个类中创建一个类的对象吗?
/* State.h */
class State{
private:
/*...*/
State PrevState;
};
错误:
field 'PrevState' has incomplete type
像 Java 和 C# 一样,我可以在同一个类中创建一个类的对象吗?
/* State.h */
class State{
private:
/*...*/
State PrevState;
};
错误:
field 'PrevState' has incomplete type
您不能按照书面规定执行此操作。当您在类 ( ) 中直接将变量声明为某种类型时,Type variablename
用于变量分配的内存将成为其父类型分配的一部分。知道了这一点,你为什么不能这样做就很清楚了:分配会递归地扩展——PrevState
需要为其成员分配空间, PrevState
等等。此外,即使可以通过这种方式分配无限量的内存,构造函数调用也会无限递归。
但是,您可以定义一个变量,它是包含类型的引用或指针,State &
或者State *
(或某些智能指针类型),因为这些类型的大小是固定的(引用通常是指针大小的,而指针将是4 或 8 个字节,具体取决于您的架构)。
那么为什么你可以在 C# 和 Java 中做到这一点,但你不能在 C++ 中做到这一点呢?
在 C++ 中,对象可以包含子对象。这意味着子对象的内存将成为包含它的对象的一部分。但是,在 C# 和 Java 中,对象不能有子对象,当您State PrevState;
使用其中一种语言进行操作时,内存位于容器之外的其他位置,并且您仅持有对类中实际对象的“引用”。要在 C++ 中做到这一点,您将使用指向实际对象的指针或引用。
你误会了State PrevState
和State* PrevState
。问题的原因是您假设 C++ 是任何东西,就像 Java 和 C# 一样。它不是。你需要花一些时间来复习你的 C++。