2017-08-27 117 views
1

我想補充兩個班的內容,並將它們保存在其他類手術後分配對象。我創建了構造函數,參數化構造函數,析構函數和超載參數=。它工作正常進行Demo b = a;但是當我嘗試保存由a.addition(b)給出的對象,有錯誤no viable overloaded '='。我的理念是爲什麼對象沒有被複制到新創建的對象?通過操作

類演示

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; 
    } 
}; 

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

您的賦值運算符很奇怪。它改變* rhs *而不是* lhs *。如果我寫'a = b',我不希望b被修改。 – StoryTeller

+0

@StoryTeller你是對的。那是錯誤的。 –

回答

3

operator=需要referecne到非const(即Demo&)作爲它的參數,不能結合到臨時對象由addition返回。

爲了解決這個問題,你應該改變參數類型來引用到常量(即const Demo&),其可以結合到臨時和是常規的。

順便說一句:分配的目標和源似乎是相反的。我想這應該被實現爲

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

,並宣佈getData作爲const成員函數。