我目前正在我的大学学习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上得到一个未处理的异常(堆栈溢出),所以很明显我搞砸了它。
有人可以指出我的代码有什么问题吗?
答案 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;
}