2

ここでやろうとしているのは、% 演算子をオーバーロードして、分子に特定の数値を掛けることです。プログラム内の他のオーバーロードされた演算子はすべて完全に機能しますが、これは問題を引き起こしています。この問題を分離するために、このオーバーロードされた演算子のみを使用して別の小さなプログラムを作成しました。

modu.h ファイルから (いくつかの無関係な部分が省略されていることを願っています):

class fraction {
      private:
         int numerator, denominator;
      public:
         fraction ();
         fraction (int n, int d);
         void print ();
         void operator% (int x);
};

// the constructors and print functions work fine for the other overloaded
// operators so I decided to omit them

void fraction::operator%(int x) {
  numerator = numerator * x;
}

このようにmain.cppファイルでそれらを使用すると

fraction frct (2, 3); // declare a fraction with a value of 2/3
frct = frct % 3;

これらのエラーが発生します

modu.cpp:9:17: error: no match for ‘operator=’ in ‘frct = frct.fraction::operator%(3)’
modu.cpp:9:17: note: candidate is:
In file included from modu.cpp:3:0:
modu.h:6:7: note: fraction& fraction::operator=(const fraction&)
modu.h:6:7: note:   no known conversion for argument 1 from ‘void’ to ‘const fraction&’

そして、「 frct = frct.%(3); 」のように使用すると、エラーが発生します。

modu.cpp:9:15: error: expected unqualified-id before ‘%’ token

セミコロンと中かっこの欠落を何度か確認しましたが、すべてが正常に機能しているように見えます。

4

2 に答える 2

3

オーバーロードされた演算子関数に戻り値がありません。次のようにします。

fraction & fraction::operator% (int x) {
    numerator = numerator * x;
    return *this;
}

また、実際にオブジェクトの値を変更しているので、%=?のような別の演算子を使用した方が混乱が少ないかもしれません。

編集:実際に演算子をどのように使用するか(結果をオブジェクトに代入する)を見て、実際にオブジェクトを変更せず、代わりに次のように結果で新しいインスタンスを作成した方がよいと思います:

fraction fraction::operator% (int x) const {
    fraction result(*this);
    result.numerator = numerator * x;
    return result;
}
于 2013-04-28T08:25:41.777 に答える
2

まず、コードを保守する人が嫌いでない限り、乗算を*notと呼ぶべき%です。私は*私の答えで使用します。

算術演算子をオーバーロードする場合、考慮すべき 2 つの形式があります。

  • a *= b左オペランドを変更する代入形式。それは多かれ少なかれあなたの過負荷です。
  • a = b * cどちらのオペランドも変更せずに新しい値を返す正規形。それが、オーバーロードを使用しようとしている方法です。

割り当てフォームは一般にメンバー関数であり、慣例により、変更されたオブジェクトへの参照を返します。これにより、 のような複雑な式で使用できますa = (b *= c)。次のようになります。

fraction & fraction::operator*=(int x) {
  numerator = numerator * x;
  return *this;
}

それができたら、通常の形式を実装する簡単な方法の 1 つは、1 つの引数をコピーして代入形式を適用することです。operator*=このアプローチの利点は、公開されている限り、メンバーや友人である必要がないことです。

fraction operator*(fraction f, int x) {
  return f *= x;
}
于 2013-04-28T10:44:41.207 に答える