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

Why do i get this error when initialising a stack?

本文关键字:错误 初始化 堆栈 为什么      更新时间:2023-10-16

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

struct nod {
    int val;
    nod a;
};

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

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

 field 'a' has incomplete type 

当编译器到达该行代码时,nod尚未完全定义。 为了在类中具有类型 nod 的成员,编译器至少需要知道nod有多大。 由于nod尚未完全定义,因此编译器无法知道nod的大小。

之所以使用点头*works is because the compiler doesn't need to know what is in a点头in order to know how big a pointer-to-点头nod点头'的原因是。

即使nod是完全定义的,您仍然无法执行此操作。 一个nod会有另一个nod,另一个nod,以此类推,永远如此。 就像拿着镜子站在镜子前一样。

想一想:如果nod包含另一个nod,而又包含另一个nod,其中......(随意),nod*实际上是无限大的!

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

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

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

不完整类型错误意味着您正在尝试声明其类型仅被前向声明的变量。

如果仅执行前向声明,例如:

class nod;

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

class nod
{
    int someVariable;
    char someOtherVariable;
}