我是 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
这是我重载 operator<< 的方式:
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
所有正确的结果...
这让我发疯了。我搜索了几个小时,但没有找到解决方案或遇到同样问题的人。如果有人可以帮助我,那就太好了。谢谢你们。