C++矩阵类重载+、-、*运算符后main中调用报错问题
问题根因与修复方案
你遇到的报错核心原因是运算符重载的参数类型与实际调用时传入的参数不匹配:当前你定义的所有双目运算符形参都是MATRIX x[](在C++中数组形参会退化为MATRIX*指针类型),但main函数中调用运算符时传入的是MATRIX类的实例对象,二者类型完全不符,因此编译器无法找到匹配的运算符实现。
以下是完整修复步骤:
1. 修改类内运算符重载声明
将所有运算符的形参改为const MATRIX&常量引用,既符合重载规范,也能避免不必要的对象拷贝开销,赋值运算符返回自身引用是C++的标准实现惯例:
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+(const MATRIX& x); MATRIX operator-(const MATRIX& x); MATRIX operator*(const MATRIX& x); MATRIX& operator=(const MATRIX& x); };
2. 对应修改各个运算符的实现
加法运算符
把原有的指针访问语法x->修改为成员访问语法x.:
MATRIX MATRIX::operator+(const 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-(const 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*(const MATRIX& x) { try { if (m != x.n) { throw ERROR(); // 抛出ERROR类实例触发捕获 } // 结果矩阵行数=左矩阵行数,列数=右矩阵列数 MATRIX z(n, x.m); // 先初始化结果矩阵所有元素为0 for (int i = 0; i < z.n; i++) for (int j = 0; j < z.m; j++) z.matrix[i][j] = 0; // 矩阵乘法逻辑 for (int loop = 0; loop < n; loop++) { for (int loop2 = 0; loop2 < x.m; loop2++) { for (int loop3 = 0; loop3 < m; loop3++) { z.matrix[loop][loop2] += matrix[loop][loop3] * x.matrix[loop3][loop2]; } } } return z; } catch (ERROR e) { cout << e.E << endl; _getch(); exit(1); } }
赋值运算符
MATRIX& MATRIX::operator=(const MATRIX& x) { n = x.n; m = x.m; for (int loop = 0; loop < n; loop++) { for (int loop2 = 0; loop2 < m; loop2++) { matrix[loop][loop2] = x.matrix[loop][loop2]; } } return *this; }
3. 运行测试
修改完成后,main函数中原有的z = x + y;逻辑即可正常运行,你可以补充z.display();打印运算结果验证正确性。
内容的提问来源于stack exchange,提问作者ThundeReX
相关产品推荐
相关产品推荐

