0

このタイプのオーバーロードを使用することを提案するチュートリアル/スニペットをオンラインでたくさん見つけました:

NumeroFarlocco operator+(NumeroFarlocco n1, NumeroFarlocco n2) { ... }

しかし、この定義を.hファイルに入れると:

NumeroFarlocco operator+(NumeroFarlocco n1, NumeroFarlocco n2);

このエラーが発生しました:http: //msdn.microsoft.com/it-it/library/1zy85x1e (v = vs.80).aspx

だから私は次のようにオーバーロードを定義する必要があることを理解しました:

NumeroFarlocco operator+( NumeroFarlocco n2 );

しかし、実装では、操作に関係する最初の要素(前のコードでn1であったもの)のインスタンス変数にアクセスする方法を理解できません。この->変数は機能せず、変数も...

4

5 に答える 5

2

二項演算子をオーバーロードする方法は2つあります。

  • クラスメンバーとして
  • 無料のオペレーターとして

どちらも異なるコンテキストで有効です。

struct A
{
    A operator+ (const A& other) const;
};

struct A
{};
operator+(const A& first, const A& second);

の使用に注意してくださいconst

*thisメンバーとして、追加される2つのオブジェクトはとotherです。1つ目は、暗黙の現在のオブジェクトです。

フリーオペレーターとして、2つのオブジェクトはパラメーターとして渡されるオブジェクトです。

于 2013-01-31T16:26:17.800 に答える
1
NumeroFarlocco operator+(NumeroFarlocco n1, NumeroFarlocco n2)

クラス外の定義、つまりフリー関数である必要があります。

class NumeroFarlocco {
  // ...
};

NumeroFarlocco operator+(NumeroFarlocco n1, NumeroFarlocco n2) {
  // ...
}

使用する場合NumeroFarlocco operator+( NumeroFarlocco n2 );は、クラス定義内に入ります。はい、thisポインタは左側の値にアクセスする方法です。

于 2013-01-31T16:25:53.050 に答える
0

これらは2つの異なるものです。

最初の方法:

NumeroFarlocco operator+(NumeroFarlocco n1, NumeroFarlocco n2);

+演算子の解釈方法をグローバルに定義します。

つまり、次のことを意味します。

NumeroFarlocco n = operator+(n0,n2);

2番目のものとして:

NumeroFarlocco operator+( NumeroFarlocco n2 );

あるものから別のものへの加算を解釈する方法を定義します。

あれは:

NumeroFarlocco n = n0.operator+(n1)
于 2013-01-31T16:26:50.203 に答える
0

LuchianGrigoreの答えを少し拡張したいと思います。技術的には、彼が言うように、二項演算子を定義する方法は2つあります。ただし、実際には、通常、特定の数の規則に従います。特に、新しいオブジェクト(のようなoperator+)を返すバイナリオブジェクトは通常、非メンバーとして定義され、左側のオペランドを変更する オブジェクト(のような)は通常operator+=、メンバーとして定義されます。さらに、オブジェクトを変更する関数を使用してオブジェクトを返す関数を定義することがよくあります。例:

MyType
operator+( MyType const& lhs, MyType const& rhs )
{
    MyType results( lhs );
    results += rhs;
    return results;
}

実際、私は通常、値を返す関数を作成することさえしません。それらを定義する基本クラステンプレートを作成し、それから派生します。

template <typename DerivedClass>
class MathematicOperators
{
    friend DerivedClass
    operator+( DerivedClass const& lhs, DerivedClass const& rhs )
    {
        DerivedClass results( lhs );
        results += rhs;
        return results;
    }
    //  And so on for all of the binary operators...
};

class MyClass : MathematicOperators<MyClass>
{
    //  ...
    MyClass& operator+=( MyClass const& other )
    {
        //  modify *this...
        return *this;
    }
    //  ...
};

(のフレンドは、派生クラスのプライベートメンバーにアクセスできないようにする必要がありますが、クラステンプレートでフリー関数をインラインで定義できるようにする必要があることに注意してMathematicOperatorsください

この手順に従うことを強くお勧めします。これにより、コードが大幅に少なくなり、それが保証され++= 期待される関係が得られます。

于 2013-01-31T16:54:28.927 に答える
0

まず最初に、次のチュートリアルを読んで、演算子をオーバーロードする方法に関するいくつかの基本的なルールを学習することをお勧めします。

元のコードから始めます:

NumeroFarlocco operator+(NumeroFarlocco n1, NumeroFarlocco n2);

これはあなたが本当に宣言したいことではないかもしれません。operator +を宣言する方法は、達成したいことによって異なります。

あなたの質問から仮定すると、binary +をオーバーロードしたいので、次のようにします。

friend NumeroFarlocco operator+(NumeroFarlocco n1 , NumeroFarlocco n2 );

または、上記で宣言したように:

NumeroFarlocco operator+( NumeroFarlocco n2 );

これら2つの宣言の違いは、最初の宣言はフレンド(フリー関数)であり、2番目の宣言はメンバー関数であるということです。

1つ目(フレンド関数を使用)は、オブジェクトを介して関数を呼び出さないことを意味し(グローバル関数のようなものです)、2つ目は、オブジェクトを介してこの関数を呼び出す必要があることを意味します(通常はメンバー関数で行います)。

また、演算子は関数であることを常に忘れないでください。

NumeroFarlocco x, y, z; // suppose you have empty/default c'tor

x = y + z  is equivalent to x.operaotr=(y.operator+(z))

シンジケーター、お役に立てば幸いです。

于 2013-01-31T16:55:37.373 に答える