2012-01-14 12 views
1

"="演算子をオーバーライドしたいのですが、問題があります。クラスには "="を使用するときに変更したいconstメンバーがあります。オブジェクトを分解して新しいオブジェクトが働くかもしれませんが、 "これ"は変更することはできません。そう、あなたは私を助けますか?C++のオーバーライド演算子とthis

+2

メンバーconstにラベルを付けるだけでは、オプションではないと思いますか?何故なの? –

答えて

1

変更したい会員にはmutableと印を付けることができます。これがキーワードの目的です。もちろん

、あなたはあなたがPIMPLイディオムを使用することができます... operator=クラスを変更しないことを、あなたのクラスのユーザーに

+0

実際には、オブジェクトのconstメンバーを別のメンバーにコピーするために "="を使用したいだけです。デコンストラクタとコンストラクタを使用してそれを作成する方法を知りたいと思います。 – TonyWen

+0

@ TonyWen:明示的にデストラクタを呼び出してから、配置 'new'を使用することはできますが、それは例外セーフではありません。 –

+0

@BenVoigt:リスクフリーは楽しいものではありません... –

1

を暗黙の契約を破ることができます。例:

class Foo_impl 
{ 
public: 
    Foo(int x, int y, int z) 
     :x_(x), y_(y), z_(z) 
    {} 
    const int x_; 
    int y_,z_; 
}; 

class Foo 
{ 
public: 
    Foo(int x, int y, int z) 
     :impl_(new Foo_impl(x,y,z)) 
    {}  

    Foo & operator=(Foo rhs) 
    { 
     swap(rhs); 
     return *this; 
    } 

    void swap(Foo & rhs) 
    { 
     std::swap(impl_, rhs.impl_); 
    } 

    // still need copy constructor 
private: 
    std::unique_ptr<Foo_impl> impl_; 
}; 

私は本当にこの点を見ません。