2

私は次のような分数クラスを持っています。

class Fraction
{
  int num, den ;

  public:
   //member functions here
} ;

私はいくつかの本を読みましたが、「効果的なc ++」は、加算演算子を非メンバー関数としてオーバーロードする方が良いと思います。そこに与えられた理由は、それが可換加算を可能にするということでした。これは、加算演算子のオーバーロードされた関数のプロトタイプです。

Fraction operator + (const Fraction &obj, const int add_int) ;

ここで、私がそれを呼ぶとき、私はそれをこのようにしなければなりません。

f1 + 2 ;

しかし、それはこのようには機能しません。

2 + f1 ;

そのためには、関数を再度記述し、その中のパラメーターの順序を変更する必要があります。

関数を1回オーバーロードして可換加算を実行できる方法があるかどうか知りたいのですが。

4

4 に答える 4

5

可能ですが、クラスに追加したい型の暗黙のコンストラクターがある場合に限り、これは機能します。

class Fraction
{
    int num, den;

public:
    Fraction(int n) :num(n), den(1) {}

    // member functions here
};

Fraction operator+(Fraction lhs, Fraction rhs) { ... }

int main()
{
    Fraction f1(5);
    f1 = f1 + 5;
    f1 = 5 + f1;
}

もちろん、これにより、実際には言及していなかった使用法、つまり2つのFractionオブジェクトを追加する機能が可能になります。

Fraction f1(1), f2(2);
Fraction f3 = f1 + f2

しかし、あなたがそれを禁止したいと思うとは想像できません。

于 2012-08-26T14:38:08.790 に答える
2

これらのことを行います:

  • からへのFraction(int) 暗黙的な変換を有効にするコンストラクターを定義します。intFraction

  • operator+=()メンバー関数として定義します。

  • 次に、次operator+() のように定義し operator+=()ます。

    Fraction operator+(Fraction f1, Fraction const & f2)
    {
        f1 += f2;  //call `operator+=` member function
        return f1;
    }
    

    f1値によって渡されることに注意してください。だから、あなたはそれに追加f2して、それを返すことができます。

詳細な回答については、同様の質問に対する私の回答を参照してください。

于 2012-08-26T14:38:58.383 に答える
1

+演算子は定義ごとにC++で可換ではないため、そのための構文構造はありません。つまり、2番目のバージョンを定義する必要がありますが、実装でパラメーターを交換して最初のバージョンを呼び出すのが妥当です。

于 2012-08-26T14:40:10.967 に答える
0

暗黙的な変換または2番目の演算子定義のいずれかが必要ですが、2番目の定義を再利用可能にすることは完全に可能であるため、コードは次のようになります。

class Fraction : public commutative<Fraction>
{
  int num, den ;

  friend Fraction operator+ (int add_int, Fraction obj);
public:
   //member functions here
};
Fraction operator+ (int add_int, Fraction obj);

commutative<T>クラステンプレートのサンプルコードが必要な場合はお知らせください。

于 2012-08-26T14:51:18.460 に答える