C++类中定义的struct结构体成员在构造函数内初始化访问报错如何解决
问题根因
- C++构造函数的初始化列表仅支持直接初始化类的一级成员,不能直接访问成员的内部子成员做初始化,你写的
_start.x(start_x)属于语法不兼容,所以编译器抛出语法错误。 - 你原有代码还存在逻辑笔误:错误将end_x赋值给了_start.x,会导致_end的x成员未初始化。
可行解决方法
方法1:C++11及以上版本用聚合初始化(最推荐)
直接用花括号对结构体整体做聚合初始化,无需修改原有类定义,初始化列表写法如下:
Ship::Ship(int start_x, int start_y, int end_x, int end_y): _start{start_x, start_y}, _end{end_x, end_y}, isAfloat(true) // 额外补充未初始化的isAfloat成员,避免未定义行为 {}
方法2:构造函数体内赋值(兼容性最好,全版本支持)
不需要改动类内的结构体定义,把成员赋值逻辑移到构造函数大括号内即可:
Ship::Ship(int start_x, int start_y, int end_x, int end_y) { _start.x = start_x; _start.y = start_y; _end.x = end_x; _end.y = end_y; isAfloat = true; }
方法3:给内部结构体添加构造函数
如果要坚持用初始化列表初始化每一个成员,可以给内部的Start、End结构体新增构造函数,修改类定义如下:
class Ship { typedef struct { int x; int y; Start(int x_, int y_):x(x_), y(y_) {} }Start; typedef struct { int x; int y; End(int x_, int y_):x(x_), y(y_) {} }End; bool isAfloat; Start _start; End _end; public: Ship(int start_x, int start_y, int end_x, int end_y); };
之后初始化列表就可以直接写:
Ship::Ship(int start_x, int start_y, int end_x, int end_y): _start(start_x, start_y), _end(end_x, end_y), isAfloat(true) {}
内容的提问来源于stack exchange,提问作者Arman Iqbal
相关产品推荐
相关产品推荐

