2016-12-14 9 views
2

の代入演算子をコピーします。C++は、私は私の質問を説明するために、次の例を与える参照オブジェクト変数

class Abc 
{ 
public: 
    int a; 
    int b; 
    int c; 

}; 

class Def 
{ 
public: 
    const Abc& abc_; 

    Def(const Abc& abc):abc_(abc) { } 

    Def& operator = (const Def& obj) 
    { 
     // this->abc_(obj.abc_); 
     // this->abc_ = obj.abc_; 
    } 
}; 

ここで私はコピー代入演算子を定義する方法がわかりません。あなたはなにか考えはありますか?ありがとう。

+7

できません。 'Def'を代入可能にするには、参照ではなくポインタが含まれていなければなりません。 – Quentin

+1

^^^ケースとポイント:['std :: reference_wrapper'](http://en.cppreference.com/w/cpp/utility/functional/reference_wrapper) – StoryTeller

+0

コピーコンストラクタを使用して結果を得ることができますあなたは欲しい。ただし、参照メンバは構築中にのみ設定することができるため、代入で行うことはできません。 – 0x5453

答えて

6

参照を割り当てることはできません。あなたはできることが必要です。ポインタは機能しますが、非常に悪用されます。

std::reference_wrapper

#include <functional> 

class Abc 
{ 
public: 
    int a; 
    int b; 
    int c; 
}; 

class Def 
{ 
public: 
    std::reference_wrapper<const Abc> abc_; 

    Def(const Abc& abc):abc_(abc) { } 

    // rule of zero now supplies copy/moves for us 

    // use the reference 
    Abc const& get_abc() const { 
     return abc_.get(); 
    } 
}; 
3

参照を割り当てることはできません。このため、プレースメントの新規作成とコピーの作成で定義することができます。

Def& operator = (const Def& obj) 
{ 
     this->~Def(); // destroy 
     new (this) Def(obj); // copy construct in place 
} 

しかし、実際は不必要です。ちょうどポインタを使用してください。

+0

'Abc'は割り当て可能に見えます。営業担当者は新しいプレースメントを使用する代わりに割り当てることができませんでしたか? – StoryTeller

+0

*ヤック*。これは賢明でひどいものです。 +1。 – Quentin

+2

@StoryTellerこれは現在の 'Abc'を修正し、参照を「再バインド」しません。 – Quentin

関連する問題