C++自定义类二维数组初始化问题求助(八皇后项目场景)
错误原因说明
错误1触发原因
你自定义了Square类的带参构造函数后,C++不会再自动为它生成无参默认构造函数。而你在Chessboard类中声明的Square squares[8][8]是Square类型的二维数组,在进入Chessboard构造函数的函数体之前,数组内的所有元素会先尝试调用无参默认构造完成初始化,找不到对应函数就会触发报错。
错误2触发原因
new Square(i,j)返回的是Square*类型的堆内存指针,而squares[i][j]是Square类型的栈对象,两种类型不匹配,没有对应的赋值运算符重载实现,所以触发报错。
修复方案(满足动态分配Square实例的需求)
第一步:修改Chessboard类定义
将存储Square对象的数组改为存储Square指针的数组,同时声明析构函数:
class Chessboard{ Square* squares[8][8]; public: Chessboard(); ~Chessboard(); };
第二步:修改Chessboard构造函数实现
直接给指针赋值堆实例地址即可:
Chessboard::Chessboard(){ for(int i=0;i<8;i++){ for(int j=0;j<8;j++){ squares[i][j] = new Square(i,j); } } }
第三步:实现Chessboard析构函数
逐个释放所有动态分配的Square实例,避免内存泄漏:
Chessboard::~Chessboard(){ for(int i=0;i<8;i++){ for(int j=0;j<8;j++){ delete squares[i][j]; } } }
其他注意事项
- 你当前的
Square类没有析构函数的必要,它没有动态分配的成员变量,C++自动生成的默认析构函数足够使用。 Square类里的成员变量avaible拼写错误,正确拼写是available,注意后续实现成员函数时保持一致。- 记得补全
Square类的成员函数实现,参考示例:
Square::Square(int x_, int y_):x(x_), y(y_), available(true) {} bool Square::isAvailable(){ return available; } void Square::swapStatus(){ available = !available; }
- 如果后续不想手动管理内存,也可以用
std::vector<std::vector<std::unique_ptr<Square>>>替代原生数组,内存会自动释放,不需要手动实现析构函数。
内容的提问来源于stack exchange,提问作者Finley Adams
相关产品推荐
相关产品推荐

