【问题标题】:Initialize a 2D vector inside constructor of class在类的构造函数中初始化一个二维向量
【发布时间】:2019-06-11 14:46:55
【问题描述】:

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

class Matrix
{

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


};

【问题讨论】:

标签: c++ vector constructor initialization assign


【解决方案1】:

首先,如前所述,这是:

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 是列出初始化的特定位置。构造函数主体中的任何内容都不是初始化。当您不为成员放置初始化程序时,它是默认初始化的。然后运行构造函数主体中的代码。正如我们所知,函数体由执行的语句组成。

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

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

【讨论】:

    【解决方案2】:

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

    Matrix(size_t x, size_t y) :a(x, vector&lt;int&gt;(y , 0 )) { }

    【讨论】:

    • 打错字了?为什么?为什么我不能像在我的代码中那样初始化它?
    • @SergeyA 在这种挑剔级别上,它被称为成员初始化列表。此外,您不应该对非代码使用代码格式:它对屏幕阅读器(以及,进而对使用它们的人)有害。
    • @ArisKoutsoukis 因为那不是初始化事物的方式。
    • @ArisKoutsoukis “为什么我不能像在我的代码中那样初始化它?” - 它工作吗?您发布问题的原因不是因为它没有工作吗?
    • @ArisKoutsoukis “因为标准这么说”是原因。构造函数的主体行为与任何其他函数一样,因此a(x, vector&lt;int&gt;(y , 0 )); 表示对名为a 的方法的调用。只有初始化列表是特殊的,构造函数体不能做任何其他成员函数不能做的事情。
    【解决方案3】:

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

    所以这个说法

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-09-06
      • 1970-01-01
      • 1970-01-01
      • 2022-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多