如何重载operator + =以添加两个类对象

时间:2017-04-04 19:13:43

标签: c++ operator-overloading

我目前正在我的大学学习C ++课程。我们正在讨论指针和重载运算符。任务是英语长度单位(英尺和英寸)。

我想重载operator+=。我希望结果是这样的:

d3 = d1 += d2; // d1, d2, d3 are class objects. Lets say d1(3, 4) and d2(1, 3). So the result should be d3(4, 7)

首先,有一个名为EnglishDistance的类(假设所有构造函数都已正确创建)

class EnglishDistance
{
private:
    int f, i;
public:
    EnglishDistance(int x, int y);
    EnglishDistance();

    // Do some other stuff
}

在这个类中,除其他外,我已经实现了operator+的重载(可以正常工作):

EnglishDistance operator+(EnglishDistance d) {
        EnglishDistance temp;

        temp.f = f + d.f;
        temp.i = i + d.i;

        // Some checks (if inches are >= 12 I will subtract 12 inches and add 1 feet)

        return temp;
}

这就是我到目前为止关于operator+=

的内容
EnglishDistance& operator+=(EnglishDistance& d) {

        *this += d

        // This is the check I was talking about. Only in this instance I am applying it on a pointer.
        while (this->i >= 12) {
            this->i -= 12;
            this->f++;
        }

        return *this;
}

当我尝试运行它时,我在Visual Studio上得到一个未处理的异常(堆栈溢出),所以很明显我搞砸了它。

有人可以指出我的代码有什么问题吗?

2 个答案:

答案 0 :(得分:2)

 *this += d

忽略这条线不会编译(缺少分号)的事实,它在逻辑上也毫无意义;在实现此操作的函数内部,您再次调用该操作!

这将导致无限的函数调用链,最终将您的堆栈粉碎成碎片并导致程序崩溃。

您实际上需要告诉计算机应该如何实现,而不是仅重复您希望如何使用该功能。

我怀疑你的意思是:

this->f += d.f;
this->i += d.i;

this->可以省略)

答案 1 :(得分:1)

正如其他人所说,*这+ = d正在呼唤EnglishDistance& operator + =(EnglishDistance& d),然后点击* this + = d,这就是调用EnglishDistance& operator + = and on and on,直到堆栈溢出。

到目前为止,您在任何代码中都根本不需要“this”。无论如何,我觉得这让你感到困惑。您可以完全省略它,只需直接使用成员的名字。

此外,使用完全有意义的名称恰当地命名您的成员。你未来的同事会感谢你。

EnglishDistance & operator+=(EnglishDistance & rhs)
{
    // Convert to inches when adding
    m_inches += rhs.m_inches + rhs.m_feet * 12;

    // Now calculate the feet
    m_feet   += m_inches / 12;
    m_inches = m_inches % 12; // modulo operator gives remainder

    return *this;
}