我正在尝试编写一个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)'
时没有匹配函数答案 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) { ... }