2017-08-27 23 views
1

2つのクラスの内容を追加して別のクラスに保存したいとします。私はコンストラクタ、パラメータ化されたコンストラクタ、デストラクタを作成し、=パラメータをオーバーロードしました。 Demo b = a;は正常に動作していますが、a.addition(b)で指定されたオブジェクトを保存しようとすると、エラーno viable overloaded '='が発生します。私のコンセプトは、オブジェクトが新しく作成されたオブジェクトにコピーされない理由です。操作後のオブジェクトの割り当て

int main(void) 
{ 
    Demo a(10); 
    Demo b = a; 
    Demo c; 
    c = a.addition(b); // error here 
    return 0; 
} 
+1

あなたの代入演算子は奇妙です。これは、* ls *の代わりに* rhs *を変更します。 'a = b'と書くと、私はbが修正されるとは思わない。 – StoryTeller

+0

@StoryTellerあなたは正しいです。それは間違っている。 –

答えて

3

operator=

class Demo 
{ 
    int* ptr; 
public: 
    Demo(int data = 0) { 
     this->ptr = new int(data); 
    } 
    ~Demo(void) { 
     delete this->ptr; 
    } 
    // Copy controctor 
    Demo(Demo &x) { 
     ptr = new int; 
     *ptr = *(x.ptr); 
    } 
    void setData(int data) { 
     *(this->ptr) = data; 
    } 
    int getData() { 
     return *(this->ptr); 
    } 

    Demo operator = (Demo& obj) { 
     Demo result; 
     obj.setData(this->getData()); 
     return result; 
    } 

    Demo addition(Demo& d) { 
     Demo result; 
     cout << "result: " << &result << endl; 
     int a = this->getData() + d.getData(); 

     result.setData(a); 

     return result; 
    } 
}; 

主クラスのデモは、一時的に結合することができないパラメータとして非constへreferecne(すなわちDemo&)を、取りオブジェクトはadditionによって返されました。

問題を解決するには、パラメータタイプをconst(つまりconst Demo&)を参照するように変更する必要があります。これは一時的にバインドする可能性があり、従来のものです。

BTW:割り当てのターゲットとソースは反対のようです。私はそれが

Demo& operator= (const Demo& obj) { 
    setData(obj.getData()); 
    return *this; 
} 

として実装され、constメンバ関数としてgetData宣言するべきであると仮定します。