【发布时间】:2021-12-09 16:48:26
【问题描述】:
我编写了一个程序来将两个矩阵相加、相减和相乘。为此,我重载了运算符 +、- 和 *,但是当我主要使用它们时,我收到一个错误消息:
no operator "+" matches these operands我不知道问题所在。也许我使用了不正确的逻辑来重载类的运算符,现在我被它困住了。 代码如下
#include <iostream>
#include <conio.h>
#include <string>
#include <ctime>
using namespace std;
class ERROR
{
public:
string E = "Number of Columns of Matrix A is not Equal to Number of Rows of Matrix B";
};
class MATRIX
{
private:
static const int number = 100;
int matrix[number][number];
int n;
int m;
public:
MATRIX();
MATRIX(int,int);
void display();
MATRIX operator+(MATRIX x[]);
MATRIX operator-(MATRIX x[]);
MATRIX operator*(MATRIX x[]);
MATRIX operator=(MATRIX x[]);
};
int main()
{
srand(time(0));
MATRIX x(2, 2), y(2, 2);
cout << "Matrix 1 " << endl;
x.display();
cout << endl;
cout << "Matrix 2 " << endl;
y.display();
cout << endl;
MATRIX z(2, 2);
z = x + y;
}
// Constructors of Class Matrix
MATRIX::MATRIX()
{
n = number; m = number;
for (int loop = 0; loop < number; loop++)
{
for (int loop2 = 0; loop2 < number; loop2++)
{
matrix[loop][loop2] = 1 + rand() % 50;
}
}
}
MATRIX::MATRIX(int rows, int col)
{
n = rows; m = col;
for (int loop = 0; loop < n; loop++)
{
for (int loop2 = 0; loop2 < m; loop2++)
{
matrix[loop][loop2] = 1 + rand() % 50;
}
}
}
// Display function for Class
void MATRIX::display()
{
for (int loop = 0; loop < n; loop++)
{
for (int loop2 = 0; loop2 < m; loop2++)
{
cout << matrix[loop][loop2] << " ";
}
cout << endl;
}
cout << endl;
}
// Operators Overloaded for Array
MATRIX MATRIX::operator+(MATRIX x[])
{
MATRIX z(n,m);
for (int loop = 0; loop < n; loop++)
{
for (int loop2 = 0; loop2 < m; loop2++)
{
z.matrix[loop][loop2]= matrix[loop][loop2] + x->matrix[loop][loop2];
}
}
return z;
}
MATRIX MATRIX::operator-(MATRIX* x)
{
MATRIX z(n, m);
for (int loop = 0; loop < n; loop++)
{
for (int loop2 = 0; loop2 < m; loop2++)
{
z.matrix[loop][loop2] = matrix[loop][loop2] - x->matrix[loop][loop2];
}
}
return z;
}
MATRIX MATRIX::operator*(MATRIX x[])
{
try
{
if (m == x->n)
{
MATRIX *y[number][number];
for (int loop = 0; loop < n; loop++)
{
for (int loop2 = 0; loop2 < m; loop2++)
{
for (int loop3 = 0; loop3 < m; loop3++)
{
y[loop][loop2] += matrix[loop][loop3] * x->matrix[loop3][loop2];
}
}
}
return *this;
}
throw;
}
catch (ERROR e)
{
cout << e.E << endl;
_getch();
exit(1);
}
}
MATRIX MATRIX::operator=(MATRIX x[])
{
for (int loop = 0; loop < n; loop++)
{
for (int loop2 = 0; loop2 < m; loop2++)
{
matrix[loop][loop2] = x->matrix[loop][loop2];
}
}
return *this;
}
【问题讨论】:
-
运算符被定义为将
MATRIX的数组作为第二个操作数。您应该改用 const ref:MATRIX operator+(MATRIX const& x);此外,由于您将重载复制赋值运算符,您还应该实现一个复制构造函数 (MATRIX(MATRIX const&)) 以遵守规则 3。此外,按照惯例,复制赋值运算符返回对当前对象的引用,而不是副本:MATRIX& operator=(MATRIX const&)
标签: c++ visual-c++ compiler-errors c++17 operator-overloading