2013-04-17 7 views
37

所有オブジェクトのライフスパンが所有者にリンクされている一般的な状況では、私は2つの方法のうちの1つを使用できます。 。unique_ptrを割り当てるかリセットする必要がありますか?

class owner 
{ 
    std::unique_ptr<someObject> owned;  
public: 
    owner() 
    { 
     owned=std::unique_ptr<someObject>(new someObject());   
    } 
}; 

リセット方法を利用することができます:ベストプラクティスの利益に

class owner 
{ 
    std::unique_ptr<someObject> owned;  
public: 
    owner() 
    { 
     owned.reset(new someObject()); 
    } 
}; 

、私は他の上の一つの形を好むでしょうか?それは割り当てることができ

編集:申し訳ありません。私はこれを単純化しました。ヒープ割り当ては、初期化メソッドで行われ、ctorでは行われません。したがって、私はイニシャライザリストを使用することはできません。別に私はresetを好むことから

owner() : owned(new someObject()) 
{} 

あなたは役に立たない中間を作成しないよう:

答えて

27

オブジェクトの転送所有権は、std::forward<E>(r.get_deleter())から割り当て続いreset(r.release())を呼び出すことによって、*この場合のように、Rによって指さ。

そして、それだけで「あなたは役に立たない中間のインスタンスを作成していないとして、私はリセット好む」直接

+26

私はそれが遅れていることを知っていますが、将来の読者のためだけです。彼の著書Effective Modern C++のScott Meyersによると、std :: make_unique が推奨されています。これは例外的な安全性を提供するためです:owner = std :: make_unique ()。問題は、std :: make_unique がC++ 14(C++ 11ではなく)の一部ですが、ここでは[ここ](https://isocpp.org/files/papers/N3656.txt)を見つけることができます。あなたがコピー貼り付けることができる良い実装。 –

15

(あなたがリストしなかったこと)これを行うための適切な方法は、ownedのコンストラクタを使用することです(たとえオプティマイザがそこでたくさんのことをすることができるので、マシンレベルに違いはないかもしれませんが) the docs of unique_ptr's operator=から

+1

それを呼び出すために簡単ですので、あなたがそれを必要とするすべては、resetコールである - それを取得します。ありがとう – learnvst

関連する問題