【发布时间】:2013-11-02 23:14:26
【问题描述】:
我是 C++ 新手,作为练习,我做了一个分数类“Frac”。一切似乎都运行良好,除非我想打印 (a+b) 等操作的结果,a 和 b 是 Frac 对象。在我的主要功能中,我使用:
Frac a(5, 2), b(9, 2), c(a+b); //Three fractions a=5/2, b=9/2, and c = a+b = 14/2 = 7/1
cout << (a+b) << endl; //This line's result makes no sense to me : always 2686600/4201035
cout << c << endl; //This line's result is ok : 7/1
这是我如何重载运算符
ostream& operator<<(ostream &stream, Fract const& a){
stream << a.getNum() << "/" << a.getDenom(); //Num is numerator of fraction a, Denom is its denominator
return stream;
}
操作员+:
Fract& operator+(Fract const& a, Fract const& b){
Fract copy(a);
copie += b;
return copy;
}
运算符+=:
Fract& Fract::operator+=(Fract const& b){
Fract copy(b);
//Put on same denominator for add
copy.m_denom *= m_denom;
copy.m_num *= m_denom;
m_denom *= b.m_denom;
m_num *= b.m_denom;
//Now on same denominator
m_num += copy.m_num;
Fract::simplify();
return *this;
}
吸气剂:
int Fract::getDenom() const{return m_denom;}
int Fract::getNum() const{return m_num;}
当我调试程序时,一切都很好,直到 operator 中的这一行
stream << a.getNum() << "/" << a.getDenom();
在执行之前,a.m_num 和 a.m_denom 的值是好的(7 和 1,用调试器检查),但是在第一次调用之后(这里是 a.getDenom()),a.m_num 和 a.m_denom从 7 和 1 切换到 2686600 和 4201035!无论运营商如何,都是一样的,所以...
Fract a(5,2), b(9,2);
cout << (a+b) << endl << (a*b) << endl << (a/b) << endl << (a-b);
... 的输出是:
2686600/4201035
2686600/4201035
2686600/4201035
2686600/4201035
和...
Fract a(5,2), b(9,2), c(a+b), d(a*b), e(a/b), f(a-b);
cout << c << endl << d << endl << e << endl << f;
... 的输出是:
7/1
45/4
5/9
-2/1
所有正确的结果...
这让我发疯了。我搜索了几个小时,但没有找到解决方案或遇到同样问题的人。如果有人可以帮助我,那就太好了。 谢谢各位。
【问题讨论】:
-
可能不应该重载运算符print() 函数来写入您想要计算的内容。
-
@ZachStark 这是一个选项,但我真的很想发现问题,如果绕过它我会觉得很糟糕:p 谢谢!
标签: c++ operator-overloading overloading operator-keyword