C++ 为什么初始化堆栈时会出现此错误?

C++ 为什么初始化堆栈时会出现此错误?,c++,C++,我知道下面的代码不正确,但我真的想知道为什么不可能 struct nod { int val; nod a; }; 当然,我应该让它成为nod*a,但为什么我在编译时得到a字段的类型不完整? 但是,我可以在结构中创建一个指针,在我使用新操作符释放一些空间后,它可以模拟链接到内存的另一部分。想想看:如果nod包含另一个nod,它又包含另一个nod,它。。。(随意),nod实际上是无限大的 想想看:如果nod包含另一个nod,而该节点又包含另一个nod,该节点。。。(随意),nod

我知道下面的代码不正确,但我真的想知道为什么不可能

struct nod {
    int val;
    nod a;
};
当然,我应该让它成为
nod*a
,但为什么我在编译时得到
a
字段的类型不完整?
但是,我可以在结构中创建一个指针,在我使用新操作符释放一些空间后,它可以模拟链接到内存的另一部分。

想想看:如果
nod
包含另一个
nod
,它又包含另一个
nod
,它。。。(随意),
nod
实际上是无限大的

想想看:如果
nod
包含另一个
nod
,而该节点又包含另一个
nod
,该节点。。。(随意),
nod
实际上是无限大的

编译器的错误信息非常清楚:

 field 'a' has incomplete type 
当编译器到达该行代码时,
nod
尚未完全定义。为了在类中拥有类型为
nod
的成员,编译器需要至少知道
nod
有多大。由于
nod
尚未完全定义,编译器无法知道
nod
将有多大

之所以使用
nod*
而不是
nod
有效,是因为编译器不需要知道
nod
中的内容,就可以知道指向-
nod`的指针有多大


即使
nod
已完全定义,您仍然可以;我不能这样做。一个
nod
将有另一个
nod
,这将有另一个
nod
,以此类推。这就像拿着镜子站在镜子前面。

编译器的错误信息非常清楚:

 field 'a' has incomplete type 
当编译器到达该行代码时,
nod
尚未完全定义。为了在类中拥有类型为
nod
的成员,编译器需要至少知道
nod
有多大。由于
nod
尚未完全定义,编译器无法知道
nod
将有多大

之所以使用
nod*
而不是
nod
有效,是因为编译器不需要知道
nod
中的内容,就可以知道指向-
nod`的指针有多大


即使
nod
已完全定义,您仍然可以;我不能这样做。一个
nod
将有另一个
nod
,这将有另一个
nod
,以此类推。这就像拿着镜子站在镜子前。

关于你愿意做什么,你的问题还不够清楚

不完整类型错误意味着您试图声明一个类型仅被前向声明的变量

如果您仅做远期申报,例如:

class nod;
编译器知道nod是在别处定义的类。然后可以声明类型为
nod*
的指针变量。您不能取消引用它,也不能声明类型为
nod
的变量。为此,编译器需要完整的类声明:

class nod
{
    int someVariable;
    char someOtherVariable;
}

关于你愿意做什么,你的问题还不够清楚

不完整类型错误意味着您试图声明一个类型仅被前向声明的变量

如果您仅做远期申报,例如:

class nod;
编译器知道nod是在别处定义的类。然后可以声明类型为
nod*
的指针变量。您不能取消引用它,也不能声明类型为
nod
的变量。为此,编译器需要完整的类声明:

class nod
{
    int someVariable;
    char someOtherVariable;
}

因为编译器知道需要为
nod*
(通常为32位或64位)分配多少内存,即使
nod
本身尚未完全定义。换句话说,编译器只需要在该指针字段保留32位或64位插槽


另一方面,如果字段是
nod
,则编译器必须知道
nod
对象需要保留多少内存,这在
nod
本身未完全定义时是不可能的。

因为编译器知道需要为
nod*
分配多少内存(通常为32位或64位),即使
nod
本身尚未完全定义。换句话说,编译器只需要在该指针字段保留32位或64位插槽


另一方面,如果字段是
nod
,则编译器必须知道
nod
对象需要容纳多少内存,当
nod
本身没有完全定义时,这是不可能的。

我认为一个更好的问题是为什么可能?node不是nod-也有一个包含结构类型成员的结构@约翰迪林说“可能吗”?参见例。相关:.
sizeof(nod)
将是~=to
sizeof(int)+sizeof(nod)
。它是递归的,所以
sizeof(nod)
=
sizeof(int)+sizeof(nod)
=
sizeof(int)+sizeof(int)+sizeof(nod)
=
sizeof(int)+sizeof(int)+sizeof(nod)
=
。。。永远永远。@Cornstales:看到他在那里做了什么吗?我想更好的问题是为什么可能?节点不是节点-也有一个结构和该结构类型的成员@约翰迪林说“可能吗”?参见例。相关:.
sizeof(nod)
将是~=to
sizeof(int)+sizeof(nod)
。它是递归的,所以
sizeof(nod)
=
sizeof(int)+sizeof(nod)
=
sizeof(int)+sizeof(int)+sizeof(nod)
=
sizeof(int)+sizeof(int)+sizeof(nod)
=
。。。永远永远。@Cornstales:看到他在那里做了什么吗?