C++ Matrice类重载==运算符结合异常处理的输出异常问题
问题描述
我有一个名为Matrice的类,类成员包含二维数组。我重载了==运算符用来判断两个Matrice对象是否相等,同时希望在两个对象行数或者列数不相等的场景下通过异常处理逻辑抛出异常,已经写完的代码如下:
bool operator==(const Matrice& m, const Matrice& n) { std::cout << std::boolalpha; try { if (m._nrL != n._nrL || m._nrC != n._nrC) { throw false; } for (size_t i{ 0 }; i < m._nrL; ++i) for (size_t j{ 0 }; j < m._nrC; ++j) if (m._elemente[i][j] != n._elemente[i][j]) return false; return true; } catch (bool& err) { std::cerr << "\n两个矩阵的尺寸不一致,无法比较是否相等"; } }
我在主函数中测试该运算符是否正常运行,测试代码如下:
Matrice a; std::cin >> a; std::cout << a; Matrice b; std::cin >> b; std::cout << b; std::cout << (a == b);
当我输入行数或列数不相等的两个矩阵编译运行时,得到的输出类似:两个矩阵的尺寸不一致,无法比较是否相等214
我用debug工具排查后发现输出的是无意义的异常值(对应214)。我在catch()块中添加return false语句后,输出变为:两个矩阵的尺寸不一致,无法比较是否相等false。
我的问题是:能否修改operator==的代码,使该场景下不再输出末尾的false?
问题原因
你当前的代码存在两个核心问题:
- 最初的版本catch块没有return语句,函数声明要求返回bool但实际没有返回值,属于C++未定义行为,输出的214是内存中的垃圾值
- 你在catch块加了
return false后,a==b的返回值就是false,主函数的std::cout << (a == b)自然会把false打印出来,这是你看到末尾多输出false的直接原因 - 你把异常捕获逻辑写在了运算符内部,完全违背了你最初要「抛出异常给上层处理」的设计目标,属于逻辑设计错误
解决方案
有两种符合C++开发规范的修改方式,都可以实现异常场景下不输出额外布尔值的需求:
方案1:保持抛出异常的设计逻辑
把异常抛出到上层调用处处理,运算符内部不捕获异常,完全符合你最初的设计预期:
#include <stdexcept> bool operator==(const Matrice& m, const Matrice& n) { if (m._nrL != n._nrL || m._nrC != n._nrC) { // 抛出标准异常类比抛bool更规范,也更方便上层统一处理 throw std::invalid_argument("两个矩阵的尺寸不一致,无法比较是否相等"); } for (size_t i{ 0 }; i < m._nrL; ++i) for (size_t j{ 0 }; j < m._nrC; ++j) if (m._elemente[i][j] != n._elemente[i][j]) return false; return true; }
主函数中对比较逻辑做异常捕获,异常场景下不会执行输出比较结果的代码:
Matrice a; std::cin >> a; std::cout << a; Matrice b; std::cin >> b; std::cout << b; try { std::cout << (a == b); } catch(const std::invalid_argument& e) { std::cerr << "\n" << e.what(); }
方案2:放弃异常设计,用返回值表达所有状态
如果不需要强制抛出异常,也可以调整逻辑,尺寸不一致直接返回false,同时修改主函数写法,避免输出不需要的布尔值:
// 新增获取行列数的成员函数,或者把行列成员设为public bool operator==(const Matrice& m, const Matrice& n) { if (m._nrL != n._nrL || m._nrC != n._nrC) { return false; } for (size_t i{ 0 }; i < m._nrL; ++i) for (size_t j{ 0 }; j < m._nrC; ++j) if (m._elemente[i][j] != n._elemente[i][j]) return false; return true; }
主函数判断尺寸后再决定输出内容:
Matrice a; std::cin >> a; std::cout << a; Matrice b; std::cin >> b; std::cout << b; if (a.get_nrL() != b.get_nrL() || a.get_nrC() != b.get_nrC()) { std::cerr << "\n两个矩阵的尺寸不一致,无法比较是否相等"; } else { std::cout << (a == b); }
内容的提问来源于stack exchange,提问作者Dragoș-George Gherasim
相关产品推荐
相关产品推荐

