首页 > 解决方案 > 在类的构造函数中初始化一个二维向量

问题描述

我想在类的构造函数中初始化一个二维数组,但编译器给了我这个错误“调用一个类类型的对象没有适当的 operator() 或转换函数到指针函数类型”。

class Matrix
{

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


};

标签: c++vectorconstructorinitializationassign

解决方案


首先,如前所述,这是:

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

不是您初始化成员的方式。要初始化一个成员,我们使用成员初始化器 list,如下所示:

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

冒号语法是列出初始化的特定位置。构造函数主体中的任何内容都不是初始化。当您不为成员放置初始化程序时,它是默认初始化的。然后运行构造函数主体中的代码。众所周知,函数体由执行的语句组成。

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

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


推荐阅读