C++定义node结构体时parent成员报类型不完整错误原因求解
错误原因
在C中,结构体的定义是逐行完成解析的,当编译器处理到node parent这一行时,node类型本身还没有完成完整的定义,属于不完整类型。
C语法不允许在类/结构体内部定义自身类型的非静态成员变量:一方面编译器需要提前计算成员的内存大小才能确定整个结构体的内存布局,不完整类型的大小无法确定;另一方面如果允许结构体内包含同类型的实例,会出现无限嵌套的情况,结构体大小会变成无穷大,逻辑上也无法实现。
你代码中node *r_child、node *l_child不会报错,是因为指针类型的大小是固定的(仅和运行平台的地址位宽有关,32位平台为4字节、64位平台为8字节),不需要知道node的完整大小就可以定义指针类型成员。
修正方案
方案1(推荐):将父节点改为指针类型
这是二叉树节点的常规实现方式,指针可以赋值为nullptr来表示根节点没有父节点,使用灵活度最高,修改后代码如下:
struct node{ int data; node *r_child; node *l_child; node *parent; // 将原实例类型修改为指针类型 };
方案2:使用引用类型(仅适合特定场景)
如果你使用C++11及更高版本,也可以将父节点改为引用类型,但引用必须在结构体的构造函数初始化列表中完成初始化,无法表示「无父节点」的状态,仅适合节点必然存在父节点的场景:
struct node{ int data; node *r_child; node *l_child; node &parent; // 将原实例类型修改为引用类型 // 必须配套构造函数初始化引用成员 node(node& p) : parent(p), r_child(nullptr), l_child(nullptr) {} };
内容的提问来源于stack exchange,提问作者Avishek Das
相关产品推荐
相关产品推荐

