使用赋值运算符会导致编译器错

时间:2014-01-19 10:18:59

标签: c++ matrix operator-overloading dynamic-allocation

我正在尝试编写一个cpp程序来执行运算符重载的矩阵运算。

我的班级Matrix有以下变量:

int m,n // order of the matrix
int **M;

首先,我有一个构造函数和一个使用new和delete运算符的析构函数来为** M分配和释放内存。我还有重载+, - 和*运算符的函数。但是当我运行程序时,我得到了垃圾值作为结果。此外,在运行时,我收到一个错误(检测到glibc)。

这里的类似问题告诉我,我应该添加一个“深度复制”2D数组的复制构造函数。我也是这样做的。但同样的问题仍然存在。

所以我为overload = operator添加了一个函数。现在,每当我使用'='运算符时,我都会收到编译时错误(对于调用'Matrix :: Matrix(Matrix)'没有匹配函数)。

以下是我的功能:

复制构造函数

Matrix(Matrix& other)  {
  m=other.m;
  n=other.n;

  M= new int *[m];
  for(int i=0;i<m;i++)
    M[i] = new int[n];

  //deep copying matrix
  for(int i=0;i<m;i++)
    for(int j=0;j<n;j++)
      M[i][j]=other.M[i][j];
}

重载*:

Matrix Matrix::operator*(Matrix A)  {
  Matrix pro(m,A.n);
  for(int i=0;i<m;i++)
    for(int j=0;j<A.n;j++) {
      pro.M[i][j]=0;
      for(int k=0;k<n;k++)
        pro.M[i][j]+=(M[i][k]*A.M[k][j]);
    }
  return pro;
}

重载=:

Matrix Matrix::operator=(Matrix a)  {
  m=a.m;
  n=a.n;
/* 
  M=new int* [m];
  for(int i=0;i<m;i++) //I also tried allocating memory in this function
    M[i]=new int[n];
*/
  for(int i=0;i<m;i++)
    for(int j=0;j<n;j++)
      M[i][j]=a.M[i][j];
  return *this;
}

在main()中:

Matrix M1(m,n);
Matrix M2(p,q);

//inputting both matrices

Matrix M3(m,n); 
Matrix M4(m,q);

M3 = M1 + M2;  // Compile Time Error here...
M3.show();

M3 = M1 - M2;  //...here...
M3.show();

M4 = M1*M2;   //...and here.
M4.show();

编译时错误:调用'Matrix :: Matrix(Matrix)'

时没有匹配函数

2 个答案:

答案 0 :(得分:1)

Matrix& Matrix::operator=(const Matrix& a)  {
  m=a.m;
  n=a.n;
/* 
  M=new int* [m];
  for(int i=0;i<m;i++) //I also tried allocating memory in this function
    M[i]=new int[n];
*/
  for(int i=0;i<m;i++)
    for(int j=0;j<n;j++)
      M[i][j]=a.M[i][j];
  return *this;
}

赋值运算符具有错误的签名,因此return *this正在尝试调用Matrix(Matrix)类型的构造函数,该构造函数不存在。确保返回上面的引用。

答案 1 :(得分:0)

除了关于复制构造函数和赋值运算符的有效实现的其他答案(你的代码不是很有效,但它应该有效),似乎只有一点点错误:

Matrix(Matrix& other) { ... }似乎超出了命名空间。将其更改为:

Matrix::Matrix(const Matrix& other) { ... }