【问题标题】:C++ error when creating an object of a class within the same class?在同一类中创建类的对象时出现 C++ 错误?
【发布时间】:2012-07-23 10:21:44
【问题描述】:

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

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

错误:

field 'PrevState' has incomplete type

【问题讨论】:

  • 你不能那样做。你能做的最好的就是State *PrevState;。
  • 这样的对象需要无限的内存和无限的初始化时间。
  • 如果你熟悉C#,上面的代码更接近public struct State { public State nextState; }。 C++ 是一种具有值语义的语言,您必须显式请求引用语义(通过指针/引用)

标签: c++


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2013-11-20
        • 2022-11-13
        • 2011-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-10-13
        • 2012-01-01
        • 1970-01-01
        • 2022-01-16
        相关资源
        最近更新 更多