【问题标题】:Adding a member to std::vector<std::vector<int>> class in C++在 C++ 中向 std::vector<std::vector<int>> 类添加成员
【发布时间】:2022-01-03 00:08:27
【问题描述】:

我必须修改代码,以便可以将成员添加到 2D 向量。 代码以 typedef vector&lt;vector&lt;int&gt;&gt; Matrix 开头,我将其替换为 Matrix 类。 我试图从vector&lt;vector&lt;int&gt;&gt;继承使用:

class Matrix: public vector<vector<int>> {
public:
    int myMember;
};

这样我实际上不必对源代码进行太多修改。 但是,如果我尝试运行:

Matrix mymatrix (4);

它引发了一个错误:

modele.cpp:19:20: error: no matching function for call to 'Matrix::Matrix(int)'
  Matrix mymatrix (4);
                    ^
In file included from modele.cpp:8:0:
modele.h:6:7: note: candidate: Matrix::Matrix()
 class Matrix: public vector<vector<int>> {
       ^
modele.h:6:7: note:   candidate expects 0 arguments, 1 provided

【问题讨论】:

  • 1.默认情况下不继承构造函数。 2. 从标准库容器继承通常不是一个好主意。它在某些情况下有效,但通常最好创建一个显式的公共接口并使用组合而不是继承。 3. 一个矩阵很难用一个嵌套向量来表示。更好的表示是通过一个平面数组/向量,并带有一个合适的operator() 重载,它接受ij 索引作为参数。除了出色的界面外,由于内存连续性,这也大大提高了效率。
  • @KonradRudolph 1. 谢谢。 2. 是的,我已经阅读了多个线程,您不应从标准库容器继承,但在我的具体情况下,我认为它会工作得很好。 3.同意,使用平面阵列更有效。但是按照教授的要求,必须使用嵌套向量。

标签: c++ oop c++11 inheritance


【解决方案1】:

默认情况下不继承构造函数,但可以在派生类中使用它们,因为您必须执行以下操作:

#include <vector>
#include <iostream>
class Matrix : public std::vector<std::vector<int>>{
    public:
        using vector::vector;
        int myMember;
};

int main(){
    Matrix data(1);
    std::vector row = {1,2,3,4,5};
    data.push_back(row);


    for(auto i: data){
        for(auto r : i){
            std::cout << r << std::endl;
        }
    }
}

这样编译器将知道基类中的所有构造函数。并将为您的派生类调用适当的构造函数。

【讨论】:

  • 成功了。谢谢。
猜你喜欢
  • 2020-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-16
  • 2017-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多