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