在类本身中创建一个类的实例

Oh2*_*Oh2 9 c++ declaration

我是C++的新手并且有一个问题:

比较以下代码:

class Node { 
public:
    int data;
    Node* x;
};
Run Code Online (Sandbox Code Playgroud)

class Node { 
public:
    int data;
    Node x;
};
Run Code Online (Sandbox Code Playgroud)

我知道代码的第二部分无法通过编译.但我想知道原因.

它与内存分配或语法规则有关吗?

如果有人能解决我的问题,我将不胜感激.

mol*_*ilo 14

如果你可以,那么a Node将包含a Node,其中包含a Node,其中包含a Node,其中包含a Node,其中包含a Node,其中包含a Node,其中包含a Node,其中包含a Node,其中包含a Node,其中包含a Node,其中包含a Node,其中包含a Node,其中包含a Node,其中包含a Node,其中包含a Node,其中包含a Node,其中包含a Node,其中包含a Node,其中包含a Node,其中包含a Node,其中包含a Node,其中包含a Node,其中包含a Node,其中包含a a Node,其中包含a Node,其中包含a Node,其中包含a Node,其中包含a Node,其中包含a Node,其中包含a Node,其中包含a Node,其中包含a Node,其中包含a Node,其中包含a Node,其中包含a Node,其中包含a Node,其中包含a Node,其中包含a Node,其中包含a Node,其中包含a Node,其中包含Node...等等,直到宇宙充满Nodes并内爆.

  • 宇宙同时充满了"节点",并且充满了**一个"节点",这更令人恐惧. (6认同)
  • 问题的正确可视化 (2认同)

Mar*_* J. 12

在你的第二个片段中的代码不能编译,因为类Node不完全在您声明它的数据成员的时候定义xNode类型.

为了理解,想象一下如果它可以编译,它将导致某种"无限递归结构",这将占用无限量的内存.这是这种类对象的假设布局:

{
  data: int
  x: Node
  {
    data: int
    x: Node
    {
      data: int
      x: Node
      {
        ...
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

第一种情况是有效的,因为您不需要完全定义类来声明指向它的指针.
我发现将"完全定义"视为"编译器知道这个类有多大"有助于解释这样的问题:编译器需要知道一个类声明它的实例有多大,但不要声明一个指向它的指针,无论类如何都具有相同的大小.


Mik*_*our 7

它与基本逻辑更相关.为了Node包含与自身相同大小的对象和其他东西,它必须比自身大,或者大小无限.

该语言也会阻止它,因为该类型在其自己的定义中是不完整的(因此您甚至不能具有包含其自身的其他空类的退化情况).但这相当于更基本的逻辑不可能性.