如何在WILMA类构造函数中初始化带引用成员的FRED类实例?
解决方案
核心问题在于C++类成员的初始化顺序和引用成员的特性:FRED的引用成员必须在构造阶段完成绑定,且无法后期赋值;同时WILMA的成员会按声明顺序初始化,bar在foo之后声明,但原代码试图在构造函数体内先给foo赋值再初始化bar,这时候bar已经尝试过默认初始化(而FRED没有默认构造,直接编译失败)。
正确的做法是利用构造函数初始化列表,先完成foo数组的初始化,再直接初始化bar,不需要在构造函数体内做赋值操作:
class WILMA { private: BARNEY foo[2]; FRED bar; public: WILMA(uint8_t *p) : foo{BARNEY(p[0]), BARNEY(p[1])}, // 在初始化列表中直接初始化数组元素 bar(foo[0], foo[1]) // 此时foo已完成初始化,可直接传入引用 { // 构造函数体无需额外操作 } };
关键说明
- 初始化顺序匹配声明顺序:类成员的初始化顺序由它们在类中的声明顺序决定(这里
foo先于bar声明),所以初始化列表中先写foo再写bar符合执行逻辑,确保初始化bar时foo的实例已经存在。 - 避免默认构造依赖:通过初始化列表直接构造
FRED实例,绕开了对默认构造函数的需求,完全符合你不修改FRED类的要求。 - 指针方法的问题排查:你之前用指针的方法编译通过但运行挂起,和FRED的引用成员本身无关,大概率是
BARNEY的构造逻辑有问题,或者指针未正确释放导致内存泄漏/野指针,但用成员变量的方式更简洁且无需手动管理内存。
内容的提问来源于stack exchange,提问作者Jim M
相关产品推荐
相关产品推荐

