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 に答える