【发布时间】:2021-12-17 19:59:08
【问题描述】:
我有一个类 Matrice 以 2d-array 作为成员。我已经重载了运算符
==以检查 2 Matrice 是否相等,我很好奇我是否可以将异常处理应用于throw,如果 第一个 obj 的列数不等于第二个 OR 行数,这就是我所做的。
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 << "\nVerificarea egalitatii dintre cele doua matrice nu este posibila!";
}
}
在我的主要工作中,我尝试检查操作员是否在工作。
Matrice a;
std::cin >> a;
std::cout << a;
Matrice b;
std::cin >> b;
std::cout << b;
std::cout << (a == b);
当我用不同数量的列或行数为数组编译它时,它给了我类似的东西:
Verificarea egalitatii dintre cele doua matrice nu este posibila!214
我使用了调试,它显示了一个 true(214)。我将
return false放入catch(),现在它显示我:Verificarea egalitatii dintre cele doua matrice nu este posibila!false.
最后我的问题是,是否可以修改
operator==的代码,使其不再显示false?
【问题讨论】:
-
请每个 stackoverflow.com 问题一个问题。请edit您的问题并专注于一个可以有一个明确的答案的问题。一般来说:C++ 允许您随时抛出异常。
-
true/false输出来自std::cout << (a == b);而不是来自operator==。 -
您可以将
Matrix类设为模板,其中行数和列数是模板参数。那么像Matrix<2, 4>这样的矩阵与Matrix<4, 2>是不同的类型。 -
您的
operator==应该要么抛出异常并让调用函数处理它,要么静默返回false。来自operator==的打印错误不是预期行为。 -
或者如果矩阵大小应该在运行时可配置,那么我不确定一个异常是否是处理大小不匹配的正确方法。而是返回
false?但是如果你想使用异常,那么只需抛出一个适当的异常(最好从std::exception继承)并且不要捕获它。相反,您让调用者(进行比较的代码)处理此类错误。==运算符应该不打印错误消息(这不是==的预期行为)。