c++ - 在类的构造函数中初始化一个二维向量
问题描述
我想在类的构造函数中初始化一个二维数组,但编译器给了我这个错误“调用一个类类型的对象没有适当的 operator() 或转换函数到指针函数类型”。
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 ));
}
不是您初始化成员的方式。要初始化一个成员,我们使用成员初始化器 list,如下所示:
Matrix(size_t x, size_t y)
: a(x, vector<int>(y , 0 ))
{}
冒号语法是列出初始化的特定位置。构造函数主体中的任何内容都不是初始化。当您不为成员放置初始化程序时,它是默认初始化的。然后运行构造函数主体中的代码。众所周知,函数体由执行的语句组成。
现在,当您执行语句时<name>(<thing>, <other thing>)
,这是一个函数调用。如果<name>
不是函数而是类实例,则operator()
改为查找函数调用运算符。如果没有(或与参数不匹配),则编译会按照您观察到的方式失败。
该语言是否可以设计为在构造函数主体内以这种形式提及成员的任何提及都被视为初始化?大概。但为什么?现在您将没有明确的方法来执行函数调用,并且在构造过程中发生的事情的顺序将不清楚。现在的方式好多了。
推荐阅读
- azure - No package Az found
- html - 如何使用响应式 css 在空 div 上设置背景图像?
- angular - 如何将一个组件作为输入传递给另一个组件?
- python - 我收到错误消息 ImportError: cannot import name 'onetime_file'" while import a python file
- javascript - 不同格式的两个相同日期给出不同的纪元时间
- node.js - nodejs中如何动态添加、修改、取消定时任务
- c++ - 卸载 CEF 崩溃
- c# - RedirectToAction 到不同区域的控制器不起作用
- javascript - 将用户给定的文本附加到块中
- javascript - javascript中antlr4访问者中的自定义上下文变量