You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 22:48:22