【问题标题】:Overloaded operator with exception handling具有异常处理的重载运算符
【发布时间】: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 &lt;&lt; (a == b); 而不是来自operator==
  • 您可以将Matrix 类设为模板,其中行数和列数是模板参数。那么像Matrix&lt;2, 4&gt; 这样的矩阵与Matrix&lt;4, 2&gt; 是不同的类型。
  • 您的operator== 应该要么抛出异常并让调用函数处理它,要么静默返回false。来自operator== 的打印错误不是预期行为。
  • 或者如果矩阵大小应该在运行时可配置,那么我不确定一个异常是否是处理大小不匹配的正确方法。而是返回false?但是如果你想使用异常,那么只需抛出一个适当的异常(最好从std::exception 继承)并且不要捕获它。相反,您让调用者(进行比较的代码)处理此类错误。 == 运算符应该打印错误消息(这不是== 的预期行为)。

标签: c++ oop exception


【解决方案1】:

如果你想要这行代码

std::cout << (a == b);

要在出现问题时抛出异常而不是打印一些东西,那么你需要让那行代码抛出异常。听起来很合理,不;)。

您的operator== 抛出异常并立即捕获它,因此该异常永远不会离开operator==,因此它具有未定义的行为,即未在所有路径上返回bool

我认为你想要的是:

bool operator==(const Matrice& m, const Matrice& n)
{
    std::cout << std::boolalpha;

    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;           
}

然后

try {
    std::cout << (a == b);
} catch (bool& err) {
    std::cerr << "\nVerificarea egalitatii dintre cele doua matrice nu este posibila!";
}

顺便说一句,您应该从标准异常基类之一继承。抛出bool 有点令人惊讶。

【讨论】:

  • 我想看看是否可以在操作符的定义中使用try,catch==
  • @Dragoş-GeorgeGherasim 是的,这就是您的代码所做的,但是当您希望 std::cout &lt;&lt; (a==b); 在出现异常时不打印任何内容时,这不是您想要的。还有不返回某些东西的未定义行为问题
  • @Dragoș-GeorgeGherasim 正如 SomeDude 在评论中提到的那样,抛出异常只是为了立即捕获它是毫无意义的,调用代码不知道异常。
  • 我不喜欢在 main 中使用 try and catch ,直到我发现没有它们是一种不好的行为,但我明白你在说什么,我会用你的例子。谢谢!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多