2011-09-30 4 views
5

スマートポインタで「ルール3」を使用すると少し混乱します。データメンバのみがスマートポインタであるクラスがある場合、デストラクタ、コピーコンストラクタ、および代入演算子を明示的に定義する必要がありますか?スマートポインタを持つ3つのルール?

スマートポインタは自動的にリソースを処理するので、明示的にデストラクタを定義する必要はないので、3つのルールに基づいて他の2つを行う必要はありません。しかし、私は、デフォルトのコピーコンストラクタがshared_ptrのようなスマートポインタに対して十分なものかどうかは分かりません。

ありがとうございました!

+0

EXP0を使用すると、使用するスマートポインタの種類を明確にすることができます。それはstd :: auto_ptrのようなものか、それともboost :: shared_ptr <>のようなものでしょうか? – Lev

答えて

10

デストラクタがshared_ptrの場合、オブジェクトの解放が処理されるため、デフォルトのデストラクタは問題ありません。デフォルトのコピーコンストラクタになります。shared_ptrを所有するオブジェクトをコピーすると、コピーはオリジナルと所有権を共有します。当然のことながら、デフォルトの代入演算子についても同様です。それがあなたが望んでいない場合は、そうでないコピーコンストラクタを定義します。たとえば、参照されるオブジェクトを複製します。

+1

代入演算子をオーバーライドすることもできます。移動構造/移動割り当てはうまくいくはずです –

1

3のルールは、実際に言う:

  1. デストラクタ
  2. 代入演算子
  3. コピーコンストラクタ:

    次のいずれかの非自明なバージョンを定義する必要がある場合

...あなたはおそらく他の2つも同様です。

あなたはとしてそれを解釈しているように見える:あなたは非自明なデストラクタが必要な場合、あなたはまた、他の二つが必要

しかし、それは全く同じではありませんか?

2

要するに、「いいえ」です。コードを単一責任クラスに分解することの全ポイントは、「スマートな」ビルディングブロックからクラスを作成して、コードをまったく書く必要がないことです。

は、次のことを考えてみましょう:

class Foo 
{ 
    std::shared_ptr<Bar> m_pbar; 
    std::string   m_id; 
}; 

このクラスは、自動的にコピーして移動コンストラクタを、彼らが得ることができる限り良いです代入演算子をコピーして移動しており、すべてが世話をしています。

あなたが極端になりたい場合は、あなたはおそらくデストラクタを書いていない、またはすべてのでコンストラクタをコピーすることは絶対に避けてくださいほとんど例のそれを言うことができる - あなたがしなければ、おそらくあなたは、その機能最高の要因がすべきは、 1つの責任で別のクラスに分けられます。

関連する問題