我知道以下代码不正确,但我真的想知道为什么它不可能。
struct nod {
int val;
nod a;
};
当然,我应该做到nod *a
,但为什么我编译时字段a
的类型不完整?
然而,我可以在结构中使a
指针在我使用new运算符释放一些空间后模拟链接到内存的另一部分。
答案 0 :(得分:2)
编译器的错误信息非常清楚:
field 'a' has incomplete type
当编译器到达该行代码时,nod
尚未完全定义。为了在类中具有类型nod
的成员,编译器需要在最小处知道nod
有多大。由于nod
尚未完全定义,编译器无法知道nod
有多大。
使用 nod *
instead of a
nod works is because the compiler doesn't need to know what is in a
nod in order to know how big a pointer-to-
nod`的原因是。
即使nod
已完全定义,您仍然无法做到这一点。一个nod
会有另一个nod
,这将有另一个nod
,依此类推。就像站在带镜子的镜子前一样。
答案 1 :(得分:1)
考虑一下:如果nod
包含另一个nod
,而nod
又包含另一个nod
......(自由),{{1}}实际上是无限的尺寸!
答案 2 :(得分:1)
因为编译器知道需要为nod*
(通常是32位或64位)分配多少内存,即使nod
本身尚未完全定义。换句话说,编译器只需要在该指针字段留下32位或64位的插槽。
另一方面,如果字段是nod
,那么编译器必须知道nod
对象需要保留多少内存,这在nod
本身不存在时是不可能的。完全定义。
答案 3 :(得分:0)
关于你愿意做什么,你的问题不够明确。
不完整类型错误意味着您正在尝试声明其类型仅向前声明的变量。
如果您只进行前瞻性声明,例如:
class nod;
编译器知道nod是在别处定义的类。然后,您可以声明类型为nod*
的指针变量。您不能取消引用它,也不能声明nod
类型的变量。为此,编译器需要完整的类声明:
class nod
{
int someVariable;
char someOtherVariable;
}