C++类:必须显式初始化成员。

问题描述 投票:0回答:1

所以,我做了这个类叫'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;
    }
}; 
c++ class variables constructor initialization
1个回答
3
投票

问题是,你的4个 Grid 成员对象被创建 之前 躯体 Field 构造函数被输入(或者至少是编译器的 想要 来生成创建它们的代码--但它不能);见 这个cppreference (粗体字为我所写)。

在构成构造函数体的复合语句开始执行之前的初始化,所有直接基、虚拟基和 非静态数据成员结束. 成员初始化列表的地方是 其中可以指定这些对象的非默认初始化。对于不能进行默认初始化的成员,可以在以下地方指定的成员,比如引用类型和const-qualified类型的成员,必须指定成员初始化器。对于没有成员初始化器的匿名联合体或变体成员,不会进行初始化。

从这句话(关于 "不能默认初始化的成员 "的备注)中,我们就可以看到,我们可以在初始化器列表中提供所需的初始化;这个初始化器被紧紧地放在结尾的 ) 的构造函数声明,使用 : 后面是必要的、以逗号分隔的初始化符。像这样,在你的情况下。

    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 成员;也许你的成员在第一个成员之后就 "放弃 "了?

© www.soinside.com 2019 - 2024. All rights reserved.