2012-01-25 6 views
4

コンパイラによって自動的に合成されるoperator =に満足しています。しかし、私は、これを行う方法がありますしてください?それはプライベートになりたいと種類operator = privateを宣言し、C++で同時にコンパイラで合成することは可能ですか?

Foo& Foo::operator= (const Foo& foo) 
{ 
    if (this == &foo) 
     return *this; 

    member1_ = foo.member1_; 
    member2_ = foo.member2_; 
    member3_ = foo.member2_; 
    ... 
    member1000_ = foo.member1000_; 

    return *this; 
} 

のページ長い定義で私のコードを膨張させたくありませんかC++ 11では

+0

短い答え:いいえ –

+1

長い答え:はい。 (下記参照):P – MOnsDaR

答えて

8

それは次のとおりです。

class Foo 
{ 
    Foo& operator=(const Foo& source) = default; 
public: 
    // ... 
}; 

は残念ながら、ほとんどのコンパイラは、まだ新しい規格のこの部分を実装していません。

+0

C++ 11は驚くべきことを続けています。 –

+0

ありがとう、それは私が欲しかったものです! –

+0

@ user1097451:あなたのコンパイラ(コンパイラはどんなものか): –

1

また、Pimplイディオムを使用することもできます。

class Foo { 
public: 
    Foo() : pImpl(new FooImpl) {} 
    // ... Foo's public interface, same as before 
private: 
    Foo& operator=(const Foo& source); //- Foo's assignment operator is private 

    struct FooImpl; 
    boost::scoped_ptr<FooImpl> pImpl; 
}; 

struct FooImpl { 
    // ... all the private data members that use to be in Foo 
    // Note: using the compiler generated copy assignment operator 
}; 

コピー代入演算子は、フー・クライアントのPOVからプライベートですが、あなたはまだFooImpl経由コンパイラ生成されたコピーの割り当てを活用することができます。 pImplポインタを使用してデータにアクセスする必要があるので、Fooのメンバ関数を実装するときにトレードオフが発生します。

関連する問題