在类

时间:2019-06-11 14:46:55

标签: c++ vector constructor initialization assign

我想在类的构造函数中初始化2D数组,但是编译器给我这个错误“在没有适当的operator()或没有将函数转换为指针到函数的类型的情况下调用类类型的对象”。 / p>

class Matrix
{

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


};

3 个答案:

答案 0 :(得分:6)

首先,如上所述:

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是列出初始化的特定位置。构造函数主体中没有什么是初始化的。当您不为成员放置初始化程序时,它将被默认初始化。然后,运行构造函数主体中的代码。众所周知,函数的主体由执行的语句组成。

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

是否可以对语言进行设计,以便在构造函数体内以这种形式提及成员时将其视为初始化?大概。但为什么?现在,您将没有明确的方法来执行函数调用,而且在构造过程中发生的顺序还不清楚。比现在好多了。

答案 1 :(得分:2)

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

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

答案 2 :(得分:2)

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

所以这句话

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; 
};