我是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并内爆.
Mar*_* J. 12
在你的第二个片段中的代码不能编译,因为类Node不完全在您声明它的数据成员的时候定义x的Node类型.
为了理解,想象一下如果它可以编译,它将导致某种"无限递归结构",这将占用无限量的内存.这是这种类对象的假设布局:
{
data: int
x: Node
{
data: int
x: Node
{
data: int
x: Node
{
...
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
第一种情况是有效的,因为您不需要完全定义类来声明指向它的指针.
我发现将"完全定义"视为"编译器知道这个类有多大"有助于解释这样的问题:编译器需要知道一个类声明它的实例有多大,但不要声明一个指向它的指针,无论类如何都具有相同的大小.
它与基本逻辑更相关.为了Node包含与自身相同大小的对象和其他东西,它必须比自身大,或者大小无限.
该语言也会阻止它,因为该类型在其自己的定义中是不完整的(因此您甚至不能具有包含其自身的其他空类的退化情况).但这相当于更基本的逻辑不可能性.