我正在练习运算符重载并构建了一个简单的计算器。
mailchimp
但遗憾的是,当我尝试实现该类时,它会抛出异常:
Proctical programming c ++中0x010154C9处的未处理异常 重载1.exe:0xC00000FD:堆栈溢出(参数:0x00000001, 0x00192F64)。
以下是template <class one> class calc {
int a;
public:
calc() : a(0) {};
calc(const calc& other) : a(other.a) {}
void print() { cout << a; }
calc& operator += (const calc& other);
calc& operator += (const one& i);
calc& operator -= (const calc& other);
calc& operator -= (const one& i);
calc& operator *= (const calc& other);
calc& operator *= (const one& i);
calc& operator /= (const calc& other);
calc& operator /= (const one& i);
const calc& operator - () const;
friend const calc operator + (const calc& our, const calc& other);
friend const calc operator + (const one& i, const calc& other);
friend const calc operator + (const calc& our, const one& i);
};
:
main
问题出现了,例如,这里,但也发生在其他运营商中:
int main() {
calc <int> one;
one += 2;
one.print();
cin.get();
}
请你告诉我我做错了什么?
答案 0 :(得分:1)
您的函数以递归方式调用自身,无条件退出:
template <class one>
calc<one>& calc <one> :: operator += (const one& i) {
*this += i;
// ^calls the function youre currently in.
return *this;
}
您需要调整+=
运算符以使用您已定义的+
运算符,或者如@PaulMcKenzie所述,在+=
中进行实际添加,并{ {1}}使用+
。例如,
+=
似乎有效。
如果警告级别足够高,您可以看到有关此警告:
警告1警告C4717:&#39; calc :: operator + =&#39; :在所有控制路径上递归,函数将导致运行时堆栈溢出
话虽如此,您的代码还存在其他一些问题,例如template <class one>
calc<one>& calc <one> :: operator += (const one& i) {
a += i;
return *this;
}
应为int a
和
one a
应该是普通的friend const calc operator + (const calc& our, const calc& other);
运营商,而不是朋友。