1

像 Java 和 C# 一样,我可以在同一个类中创建一个类的对象吗?

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

错误:

field 'PrevState' has incomplete type
4

3 回答 3

2

您不能按照书面规定执行此操作。当您在类 ( ) 中直接将变量声明为某种类型时,Type variablename用于变量分配的内存将成为其父类型分配的一部分。知道了这一点,你为什么不能这样做就很清楚了:分配会递归地扩展——PrevState需要为其成员分配空间 PrevState等等。此外,即使可以通过这种方式分配无限量的内存,构造函数调用也会无限递归。

但是,您可以定义一个变量,它是包含类型的引用或指针,State &或者State *(或某些智能指针类型),因为这些类型的大小是固定的(引用通常是指针大小的,而指针将是4 或 8 个字节,具体取决于您的架构)。

于 2012-07-25T03:00:14.813 回答
0

那么为什么你可以在 C# 和 Java 中做到这一点,但你不能在 C++ 中做到这一点呢?

在 C++ 中,对象可以包含子对象。这意味着子对象的内存将成为包含它的对象的一部分。但是,在 C# 和 Java 中,对象不能有子对象,当您State PrevState;使用其中一种语言进行操作时,内存位于容器之外的其他位置,并且您仅持有对类中实际对象的“引用”。要在 C++ 中做到这一点,您将使用指向实际对象的指针或引用。

于 2012-07-25T03:11:17.297 回答
0

你误会了State PrevStateState* PrevState。问题的原因是您假设 C++ 是任何东西,就像 Java 和 C# 一样。它不是。你需要花一些时间来复习你的 C++。

于 2012-07-25T03:05:14.217 回答