0

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

所有正确的结果...

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

4

1 回答 1

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

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

Frac operator+(...)
于 2013-11-02T23:16:33.270 回答