【问题标题】:operators overload weird output运算符重载奇怪的输出
【发布时间】: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


【解决方案1】:
Fract& operator+(Fract const& a, Fract const& b){
    Fract copy(a);
    ...
    return copy;
}

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

Frac operator+(...)

【讨论】:

  • +1 对 OP 的注释。标准运算符+ 和- 等通常返回结果操作的按值构造;不是参考。累加运算符+=、-= 等通常会返回此类引用,但这样做时要小心。 (很好的答案,先生)。
  • 天哪...非常感谢!你说得清楚而简短:D 我应该删除这篇文章吗? @WhozCraig 感谢您提供详细信息:)
  • @mebs 不。如果您的问题已经解决,您接受您认为对您最有帮助的答案。 :)
猜你喜欢
  • 2020-07-30
  • 2019-11-17
  • 2016-06-20
  • 1970-01-01
  • 1970-01-01
  • 2020-09-08
  • 2016-11-05
  • 1970-01-01
  • 2013-09-06
相关资源
最近更新 更多