2016-07-28 5 views
1

クラスメンバのコンテキストで(スマートな)ポインタをかなり読んだ後も、フォールバック状態に対処する方法はまだわかりません。スマートポインタとコピー不可能なメンバフィールド

特定のBarオブジェクトをインスタンス化するdeafultコンストラクタを呼び出すか、Fooの1つの引数コンストラクタに何らかのポインタを渡すことによって、Foo型のオブジェクトを作成します。

を引用し、どのようなタイプでm_barでしょうか?

struct Bar { 
    Bar(int k) {} 
    Bar operator=(const Bar&) =delete; 
    Bar (const Bar&) = delete; 
}; 


struct Foo { 

    Foo() : m_bar(5) {} 
    Foo(Bar b) : m_bar(b); 

    Bar m_bar; 
}; 
+0

誰が 'バー'を所有していますか? 'メイン'? 'Foo'は' Bar'を所有していますか?あるいは、 'Foo'が存在する限り、それを持たせたいのですが、必要に応じて' Bar 'を所有する別の関数(共有所有権)も望みますか? – wally

+0

"Bar?mainを誰が所有していますか?"はい "FooはBarを所有していますか?" no – user695652

+0

その場合、おそらく 'm_bar'を参照にしますか? – wally

答えて

1
  • 私はまだはFooの外にバーオブジェクトにアクセスする必要があるので、私はunique_ptrを使用することはできません。

unique_ptrは、あなたがFoo以外のオブジェクトにアクセスすることを妨げません。

「Fooオブジェクトのライフタイム以外でBarオブジェクトにアクセスする必要がある」という意味ではなく、あなたの推論は健全です。この場合、Fooはオブジェクトの唯一の所有者になることはできません。私は生のポインタを使用した場合は1、引数のCTRが呼び出された場合はFooのdeafultコンストラクタがなく、呼び出された場合

  • 、その後、私は削除コールする必要があります。

ポインタは所有者によってのみ削除する必要があります。 Fooがポインタを削除しなければならないと述べることによって、Fooがポインタを所有していることを暗示します。

オブジェクトが他のものによっても所有されている可能性がある場合、デザインは共有所有権につながるようです。

  • が、そこのshared_ptrあるが、そのような共有するよう、必要な場合を除き使用する関数のパラメータとしてスマートポインタを渡すか、またはスマートポインタ自体を操作しないでください」ハーブサッターを引用か転送所有者。 "説明を考えると

株式所有は、あなたがしようとしているとそれが明示的にスマートポインタを渡すことは適切である状況の一つとして、ハーブによってリストされている正確に何であると思われます。


ここで、所有権は条件付きで「ここ」または「そこ」であるため、共有ポインタは必ずしも必要ではありません。それは単なる最も簡単な解決策なので、良い解決策です。

状況に応じてmaybe_unique_ptrと想像することができます。このようなスマートポインタは、標準ライブラリには存在しません。エイリアステンプレート以下のあなたのために働くかもしれないが、ブーストによって異なります

template<class T> 
using maybe_unique_ptr = boost::variant<std::unique_ptr<T>, T*>; 

struct Foo { 
    Foo()  : bar(std::make_unique<Bar>(5)) {} 
    Foo(Bar* b) : bar(b) {} 

    maybe_unique_ptr<Bar> bar; 
}; 

このコースでは、あなたはそれをより面倒になりboost::apply_visitorを使用して、バリアント内のインスタンスにアクセスしなければならないことを意味します。

関連する問題