c++ - C++ 类:必须显式初始化成员
问题描述
所以,我把这个类叫做'Grid'。我也有一门课叫做'Field'。Field 类有 4 个 Grid 类型的变量,它们都在构造函数中设置。除了,他们不是......或者至少编译器不这么认为。
我真的不明白为什么,我将所有变量设置为一个新实例。
当我将鼠标悬停在红色下划线(在构造函数下方)上时,它说:“'Field' 的构造函数必须显式初始化没有默认构造函数的成员 'b_attack'”
代码:
class Grid{
friend class Field;
private:
unsigned int xSize;
unsigned int ySize;
bool *ptrfield;
Grid(unsigned int xSize, unsigned int ySize){
this->xSize = xSize;
this->ySize = ySize;
ptrfield = new bool[xSize*ySize];
}
};
class Field{
private:
Grid a_own;
Grid a_attack;
Grid b_own;
Grid b_attack;
public:
Field(unsigned int xSize, unsigned int ySize){
a_own = Grid(xSize, ySize);
a_attack = Grid(xSize, ySize);
b_own = Grid(xSize, ySize);
b_attack = Grid(xSize, ySize);
}
void print(){
std::cout << "aHELLO" << std::flush;
std::cout << a_own.xSize << std::flush;
}
};
解决方案
问题是您的 4 个Grid
成员对象是在输入构造函数的主体之前Field
创建的(或者至少,编译器想要生成代码来创建它们 - 但它不能);看到这个cppreference(加粗我的):
在构成构造函数的函数体的复合语句开始执行之前,所有直接基、虚拟基和非静态数据成员的初始化都已完成。成员初始化器列表是可以指定这些对象的非默认初始化的地方。对于不能默认初始化的成员,例如引用和 const 限定类型的成员,必须指定成员初始化器。对于没有成员初始化程序的匿名联合或变体成员不执行初始化。
从这个引用(关于“不能默认初始化的成员”的注释)中,我们可以看到我们可以在初始化列表中提供所需的初始化;)
this在构造函数声明结束后立即放置,使用 a:
后跟所需的逗号分隔的初始值设定项。像这样,在你的情况下:
Field(unsigned int xSize, unsigned int ySize) : // The ":" starts our initializer list
a_own(xSize, ySize), // .. and each one of these constructs a "Grid"
a_attack(xSize, ySize),
b_own{ xSize, ySize }, // This "{...}" form is newer and many prefer it,
b_attack{ xSize, ySize } // but it can also be a bit confusing
{
return; // We now have nothing left to do in the actual "body" of the c'tor!
}
请随时要求进一步澄清和/或解释。
PS:对于您发布的代码,我的编译器给出了您为所有四个Grid
成员报告的错误;也许你的“放弃”在第一个之后?
推荐阅读
- javascript - 使用箭头函数时封闭词汇上下文的含义(词汇 this)
- javascript - Firebase onAuthStateChanged() 不断刷新页面
- php - 将 WooCommerce 产品搜索扩展到自定义分类法和自定义字段
- java - 尝试注入 module-info.java 时找不到模块
- ios - 为什么我需要滑动按钮才能使它们工作?
- python - 在缺少公共 x 值的两行之间填充
- go - 无法在 golang 中解组数组字段
- typescript - 带有 TSX 的 TypeScript 无法进行 linting,但可以正确转译
- python - 如何将 stdout.flush 函数应用于输入提示?
- python - Qt.Key_Space 不触发