gpt4 book ai didi

c++ - 运营商重载奇怪的输出

转载 作者:行者123 更新时间:2023-11-27 23:11:55 24 4
gpt4 key购买 nike

我是 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;
}

setter/getter :

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

所有正确的结果...

这让我发疯。我搜索了几个小时,但没有找到解决方案或遇到同样问题的人。如果有人能帮助我,那就太好了。谢谢你们。

最佳答案

Fract& operator+(Fract const& a, Fract const& b){
Fract copy(a);
...
return copy;
}

您正在返回对局部变量的引用,但是当该变量过期时,所有数据都消失了。您应该按值(value)返回:

Frac operator+(...)

关于c++ - 运营商重载奇怪的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19747985/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com