复制二维向量的构造函数

时间:2014-12-30 20:07:13

标签: c++ copy-constructor

我想为二维向量

编写一个复制构造函数

相关代码:

MyMatrix :: MyMatrix(const MyMatrix & mat)       // Copy Constructor
{
    m_m = mat.m_m;
    m_n = mat.m_n;
    vector < vector <int> > m_matrix(m_n, std::vector<int>(m_m,0));

    for( int i=0;i<m_n ; i++)
    {
        for( int j=0; j<m_m ;j++)
        {
            m_matrix[i][j] = mat.m_matrix[i][j];
        }
    }
}

但它不起作用,我没有找到错误。这段代码有什么问题?

class MyMatrix
{
 public:            // Methods

    MyMatrix();
    MyMatrix(int n, int m);
    MyMatrix(int n, int m, std:: vector <std:: vector <int> > matrix );
    MyMatrix(const MyMatrix & mat) ;
    ~MyMatrix();        

  private:          // Attributes

    int m_n;
    int m_m;

    std:: vector <std:: vector <int> > m_matrix;

};

3 个答案:

答案 0 :(得分:4)

你的麻烦就在这一行:

vector < vector <int> > m_matrix(m_n, std::vector<int>(m_m,0));

它没有做你认为它正在做的事情。您认为您正在初始化您的成员变量,而是您正在创建一个具有相同名称的本地变量。

您应该使用初始化列表初始化成员变量:

MyMatrix :: MyMatrix(const MyMatrix & mat)       // Copy Constructor
   : m_m(mat.m_m)
   , m_n(mat.m_n)
   , m_matrix(m_n, std::vector<int>(m_m,0))
{
 //... 

答案 1 :(得分:2)

MyMatrix :: MyMatrix(const MyMatrix & mat):m_m(mat.m_m), m_n(mat.m_n), m_matrix(mat.m_matrix)
{
}

您正在创建一个与成员变量同名的局部变量。相信矢量可以复制自己。

答案 2 :(得分:2)

您的代码有什么问题,您要声明一个名为m_matrix的局部变量,该变量会隐藏数据成员m_matrix。您需要使用数据成员(但在此之前,您需要调整它的大小)。

更好的方法是使用初始化列表。

MyMatrix::MyMatrix(const MyMatrix & mat)
:
    m_m(mat.m_m),
    m_n(mat.m_n),
    m_matrix(mat.m_matrix)
{}

使用C ++ 11,您可以获得比上述更好的选择。只需使用隐式定义的复制构造函数。您可以通过以下方式在类定义中明确说明这一点。

class MyMatrix
{
...
public:
    ...
    MyMatrix (const MyMatrix & mat) = default;
...
};


还有另一种选择适用于C ++ 03和C ++ 11:不要写任何东西。不要声明任何符合复制构造函数的内容,并且您将获得一个隐式声明的复制构造函数。这个隐式声明的复制构造函数是隐式定义的,如果它曾被使用过,在这种情况下,隐式声明/隐式定义的复制构造函数没有一个错误。