C++中如何在子类构造函数内访问继承的父类成员字段
问题根源
你的赋值语句无法生效有两个核心原因:
- C/C++ 原生内置数组不支持
=运算符整体赋值,数组名在绝大多数场景下会退化为指向首元素的指针,不存在数组类型的直接赋值语义 - 构造函数形参中声明的
int inpawns[4][4]会被编译器自动调整为int (*inpawns)[4]类型,本质是数组指针,和左侧的二维数组成员类型不匹配,无法直接赋值。
可行实现方案
方案1:逐元素拷贝(无额外依赖,兼容性最好)
因为是public继承,父类的pawns成员在子类中可以直接访问,遍历数组逐元素拷贝内容即可,不需要额外修改父类代码:
// 假设pref类型已经提前定义 class players { public: int pawns[4][4]; }; class game : public players { private: pref prefs; public: game(pref inpref, int inpawns[4][4]); }; game::game(pref inpref, int inpawns[4][4]) { this->prefs = inpref; // 双重循环遍历拷贝二维数组 for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { this->pawns[i][j] = inpawns[i][j]; } } }
提示:由于
pawns存储的是int这类纯旧数据(POD类型),你也可以用内存拷贝函数简化写法:memcpy(this->pawns, inpawns, sizeof(this->pawns));。但如果数组元素是带自定义构造/析构的类类型,禁止使用memcpy,会导致对象构造逻辑异常。
方案2:父类增加构造函数,在初始化列表完成初始化
如果希望把数组初始化逻辑收敛到父类,可以给players增加接收数组参数的构造函数,子类在初始化列表中直接调用父类构造,效率比在构造函数体内赋值更高:
class players { public: int pawns[4][4]; players() = default; players(int inpawns[4][4]) { for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { pawns[i][j] = inpawns[i][j]; } } } }; class game : public players { private: pref prefs; public: game(pref inpref, int inpawns[4][4]); }; game::game(pref inpref, int inpawns[4][4]) : players(inpawns), prefs(inpref) // 初始化列表直接完成父类和自身成员初始化 { // 函数体不需要额外写赋值逻辑 }
方案3:用std::array替代原生数组(推荐C++项目使用)
C++标准库提供的std::array是原生数组的轻量封装,不会出现数组退化问题,原生支持=运算符整体赋值,代码更简洁不容易出错:
#include <array> // 定义4*4棋盘类型别名 using Board = std::array<std::array<int, 4>, 4>; class players { public: Board pawns; }; class game : public players { private: pref prefs; public: game(pref inpref, Board inpawns); }; game::game(pref inpref, Board inpawns) { prefs = inpref; pawns = inpawns; // 直接赋值即可正常运行 }
内容的提问来源于stack exchange,提问作者nimo
相关产品推荐
相关产品推荐

