2016-12-03 39 views
-3

我正在編寫代碼,我使用'='操作符將一個對象分配給另一個對象和一個拷貝構造函數。下面是代碼重載'='不起作用

DJSet(const DJSet& ds) 
{ 
    vector<Element<T>* > vec= ds.v_; 
    for (int i = 0; i < vec.size(); i++) 
    { 
     v_.push_back(vec[i]); 
    } 
    //cout << "Copy Called\n"; 
} 
DJSet operator=(DJSet ds) 
{ 
    DJSet<T> djs; 
    vector<Element<T>* > vec = ds.v_; 
    for (int i = 0; i < vec.size(); i++) 
    { 
     djs.v_.push_back(vec[i]); 
    } 
    cout << "= Called\n"; 
    return djs; 
} 

類DJSet包含Element<T>* type 所以只有一個矢量當我下面執行代碼。

DJSet<string> djs_rhs; 
    DJSet<string> djs_lhs; 
    cin >> name; 
    djs_rhs.add(name); 
    cin >> name; 
    djs_rhs.add(name); 

    cin >> name; 
    djs_lhs.add(name); 
    cin >> name; 
    djs_lhs.add(name); 

    djs_lhs = djs_rhs; 
    cout << djs_lhs << endl; 
    cout << endl; 
    cout << djs_rhs << endl; 

它沒有將右側的值複製到左側的對象並且它正在調用複製構造函數和'='運算符。請幫我解決一下這個。我怎麼能繼續這個?如果你願意,我可以提供整個源代碼。

回答

1

DJSet operator=(DJSet ds) - 這取值爲ds參數,所以無論何時使用賦值運算符,編譯器都會調用複製構造函數。將其更改爲DJSet operator=(const DJSet& ds)以通過引用傳遞,以便代碼不會在此處複製。

DJSet<T> djs; - 這將創建一個本地對象,並且所有其餘代碼將修改該本地對象。在賦值運算符的末尾,本地對象被破壞,並且所有的工作都被拋棄。擺脫它。

vector<Element<T>* > vec = ds.v_; - 這使得矢量的本地副本,然後用它來設置對象內的值。這不是必需的;你可以直接複製ds.v_,沒有這個額外的載體。擺脫它,並將djs.v_.push_back(vec[i]);更改爲v_.push_back(ds.v_)

2

您的操作符構造一個新的臨時對象,並將其返回。這是不正確的。賦值操作符必須根據定義,分配給this對象,並返回一個參考this

DJSet &operator=(const DJSet &ds) 
{ 
    // Fill in the blank. 

    return *this; 
} 

此外,作爲展示的,=運營商應採取const基準參數,而不是一個新的臨時對象。

您需要填寫空格,然後執行所需的操作以將*this的內容替換爲作爲參數傳遞的對象的內容。

0

的OP = jould是:

DJSet &operator=(const DJSet &ds) 
{ 
    vector<Element<T>* > vec = ds.v_; 
    for (int i = 0; i < vec.size(); i++) 
    { 
     v_.push_back(vec[i]); 
    } 
    cout << "= Called\n"; 
    return *this; 
} 

在您的實現,你是不是改性的左對象,但暫時的。 通常複製構造函數和運算符=應該幾乎相同,除了最後一次返回* this。