我想为二维向量
编写一个复制构造函数相关代码:
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;
};
答案 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:不要写任何东西。不要声明任何符合复制构造函数的内容,并且您将获得一个隐式声明的复制构造函数。这个隐式声明的复制构造函数是隐式定义的,如果它曾被使用过,在这种情况下,隐式声明/隐式定义的复制构造函数没有一个错误。