异常和运算符重载

时间:2016-03-27 20:01:20

标签: c++ exception operator-overloading

我有一个表示带有重载 - =运算符的边界矩形的类,它获取两个矩形的交集。如果没有交叉点,我会抛出一个错误:

if(/* no intersection */)
{
    throw std::runtime_error("No intersection between rectangles");
}

我的问题是:如果我使用-实现-=运算符,我应该在其中使用try / catch吗?

我应该这样做:

operator-(rect1, rect2) 
{
    try
    {
        rect1 -= rect2; 
    }
    catch( std::exception &e)
    {
        ...
    }
    return rect1;
}

或者这个

operator-(rect1, rect2)
{
    rect1 -= rect2;
    return rect1;
}

2 个答案:

答案 0 :(得分:0)

如果不详细了解要求,就无法正确回答您的问题。

我的2美分。

operator-=通常修改(左)对象; operator-通常不会。

所以我认为最好做这样的事情(假设Rect是类的名称并且存在复制构造函数)

Rect operator- (Rect const & r1, Rect const & r2)
 { return  Rect(r1)-r2; }

我的意思是:我认为你应该从operator-抛出但是(在交叉的情况下)返回一个新对象,而不是修改左操作数。

p.s:抱歉我的英语不好。

答案 1 :(得分:0)

你正走向错误的方向。即使你是维护代码的唯一人,你仍然应该遵循操作符重载的一些基本规则。

特别是,不应在-上修改左侧值,仅在-=上修改,因为这对于该类用户来说完全出乎意料。

您应该提供一种方法来说明矩形是否相交:

class Rectangle
{
    bool Intersects(Rectangle other)
    {
        /* ... */
    }
};