2012-01-16 16 views
1

こんにちは私のユーザー定義データ型オブジェクトを追加する演算子のオーバーロードを+(加算)演算子を実行しようとしています。 以下はそのコードです。標準オブジェクトとユーザー定義オブジェクトを追加する方法は?

#include <iostream> 
using namespace std; 
class complex { 
    int i; 
    double f; 
public: 
    complex(int ii=0,double ff=0){ 
     i = ii; 
     f = ff; 
    } 
    complex operator+(complex object) { 
     complex result; 
     result.i = this->i + object.i; 
     result.f = this->f + object.f; 
     return result; 
    } 
    void display() { 
     cout << i <<"\t"<< f; 
     cout << endl; 
    } 
}; 
int main(){ 
    complex obj1(1,1.1),obj2(2,2.2),obj3; 
    int i(5); 
    obj3 = obj1 + obj2; 
    obj3.display(); 
    obj3 = obj3 + i; 
    obj3.display(); 
    obj3 = i + obj3;//generates me compiler error 
    obj3.display(); 
    return 0; 
} 

私はOBJ1 + obj2の操作を行うとき、それはobj1.operatorの+(OBJ2)として、コンパイラによって展開されていることを学びました。 コードの一部が正常に動作するようにします。

しかし、intとcomplexを追加すると、i.operator(obj1)として展開されると思います。

コンパイルエラーが発生します。

私は演算子+関数をint型で定義する必要がありますか?これを解決するにはどうすればよいですか? は、あなたが入力パラメータとしてintとクラスcomplexオブジェクトを引数に取り+のオーバーロードされたバージョンを提供する必要があります、

+0

私はあなたが事業者は、一般的にすることができ、そして何が、無料の機能として実装されなければならないかについてどこかで読んことを示唆しています。 – PlasmaHH

答えて

3

をいただきありがとうございます、お勧めしてください。この関数は非メンバ関数である必要があります。

complex operator+(int i, complex object) 

あなたは、このオーバーロードされた関数内protectedまたはprivateメンバーにアクセスする場合はさらに、それはあなたのcomplexクラスのfriendを作らなければならないであろう注意してください。

これは、メンバー関数のオペレータオーバーロードに対する演算子のオーバーロードに使用されるフリー関数の強さの特有の例です。

+0

はい、このworks.Thankあなた – ZoomIn

+0

は、このような過負荷を持つことが非常にredondantなり、complex' 'へint''からの変換が存在するので。通常の解決策は、 'operator +(UDT、UDT)'を自由な関数にして、UDTに変換できるすべての型のオーバーロードを追加しないことです。 –

+0

@LucTouraille:単純な理由から暗黙的なコンバージョンを避けたい暗黙の変換コンストラクタはお勧めできません。彼らには信じてください。また、OPには常にコンバージョンコンストラクタがあります。 –

0

任意のクラスの外の関数を定義します。

complex operator + (int lhs, complex rhs) { /* ... */ } 

は、コンパイラがそれを見ることができることを確認し、あなたはあなたの心のコンテンツへの複合体にint型を追加することができます。おそらく、もう一方のパラメータを持つものも必要です。

2

これはoperator+は、通常の無料関数として定義された理由です:代わりにcomplex complex::operator+(complex object)を有するので、あなたが

complex operator+(const & complex lhs, const & complex rhs) 
{ 
    return complex(lhs.i + rhs.i, lhs.j + rhs.j); 
    // You will need some way to access i and j, either by making this function 
    // a friend of complex or by providing getters 
} 

をこのように自由に機能を定義する(べきです)ことができ、ラインobj3 = i + obj3と等価になりますoperator+(i, obj3);あなたが書いたコンストラクタのお陰で複雑な整数に変換できるので、呼び出しは成功し、これと同じになります:operator+(complex(i), obj3)。経験則として

、あなたは左側と右側のサイズが等しい重要性を持っているとき、二項演算子をオーバーロードするメンバ関数を介して無料の機能を好む必要があります。こうすれば、a op bが動作すれば、b op aも動作することがわかります。

リファレンスでは、パラメータをreference-to-constとして渡し、メンバー関数がconstのとき(たとえば、サンプルにoperator+displayなど)にマークすることをお勧めします。

関連する問題