2016-12-03 1 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; 
} 

あなたの実装では、左側のオブジェクトが、一時的なものをMODIFされていません。 通常、コンストラクタと演算子=は、最後のreturn * thisを除いてほとんど同じです。

関連する問題