在 class 的构造函数中初始化一个二维向量

Initialize a 2D vector inside constructor of class

我想在 class 的构造函数中初始化一个二维数组,但编译器给我这个错误 "call of an object of a class type without appropriate operator() or conversion functions to pointer-to-function type"。

class Matrix
{

public:
    Matrix() {};
    Matrix(size_t x, size_t y) { a(x, vector<int>(y , 0 )); }
private:
    vector<vector<int>> a; 


};

正确的语法是使用初始化列表:

Matrix(size_t x, size_t y) :a(x, vector<int>(y , 0 )) { }

首先,如前所述,这个:

Matrix(size_t x, size_t y)
{
   a(x, vector<int>(y , 0 ));
}

不是您初始化成员的方式。要初始化一个成员,我们使用成员初始化列表,像这样:

Matrix(size_t x, size_t y)
   : a(x, vector<int>(y , 0 ))
{}

The colonic syntax 是列出初始化的特定位置。构造函数体中没有任何东西是初始化。当您不为成员放置初始化程序时,它是 default-initialised。那么构造函数主体中的代码是 运行。正如我们所知,函数体由 语句 组成。

现在,当您执行语句 <name>(<thing>, <other thing>) 时,这是一个函数调用。如果 <name> 不是函数而是 class 实例,则查找函数调用运算符 operator()。如果没有(或者它与参数不匹配),则编译将以您观察到的方式失败。

是否可以将语言设计为在构造函数主体中以这种形式提及任何成员都被视为初始化?大概。但为什么?现在你没有明确的方法来执行 function-calls ,并且在构建过程中发生的事情的顺序将不清楚。现在好多了。

当控件传递给构造函数的主体时,向量就已经创建了。

所以这个声明

a(x, vector<int>(y , 0 ));

不是向量构造函数的调用。该向量已经使用默认构造函数创建,上面的语句无效。

您可以在构造函数中使用 mem-initializer 列表

class Matrix
{
public:
    Matrix() {};
    Matrix(size_t x, size_t y) : a(x, vector<int>(y ) ) {}
private:
    vector<vector<int>> a; 
};

或者你可以在构造函数的主体中使用成员函数assign

class Matrix
{

public:
    Matrix() {};
    Matrix(size_t x, size_t y) { a.assign (x, vector<int>(y ) ); }
private:
    vector<vector<int>> a; 
};