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

时间:2014-11-17 20:21:18

标签: c++

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

struct nod {
    int val;
    nod a;
};

当然,我应该做到nod *a,但为什么我编译时字段a的类型不完整? 然而,我可以在结构中使a指针在我使用new运算符释放一些空间后模拟链接到内存的另一部分。

4 个答案:

答案 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;
}