ファクトリメソッドからstd::unique_ptr
を返すことはうまくいき、推奨される方法です。それが伝えるメッセージは(IMO)です:あなたは今このオブジェクトの唯一の所有者です。さらに、あなたの便宜のために、オブジェクトはそれ自身を破壊する方法を知っています。
これは、生ポインタ(クライアントがこのポインタをどのように処分するかを覚えておく必要がある場所)を返す方がはるかに良いと思います。
しかし、私はあなたの寿命を延ばすためにポインタをリリースするあなたのコメントを理解していません。一般的に私はポインタは常にRAII構造体の一種によって管理されるべきだと思うので、release
をsmartpointerに呼び出す理由はほとんどありません。(私がrelease
と呼ぶ唯一の状況はポインタを別の管理データ構造に置くことです追加のクリーンアップを正当化するために何かをした後で、unique_ptr
は別のDeleterを持っています)。
したがって、クライアントは(とすべきである)単純であれば、複数のコピーが必要な場合、彼らは、オブジェクト(またはshared_ptr
を必要として(例えば戻さ一つから構成され、移動されている別のunique_ptr
、など)unique_ptr
どこかに格納することができますポインタの)。だから、クライアント側のコードはより次のようになりますに
std::unique_ptr<FooBar> myFoo = Foobar::factory(data);
//or:
std::shared_ptr<FooBar> myFoo = Foobar::factory(data);
個人的に私はまた、(この場合はstd::unique_ptr<Foobar>
で)返されたポインタ型のためtypedef
を追加することになりますし、または使用デリータ(この場合はstdで:: default_deleter)あなたのファクトリオブジェクト。これは後でポインタの割り当てを変更することを後で決めると(したがって、ポインタの破棄のための別のメソッドが必要になります。これは第2のテンプレートパラメータstd::unique_ptr
として表示されます)。 だから私はこのようなものだろう:
class Foobar {
public:
typedef std::default_deleter<Foobar> deleter;
typedef std::unique_ptr<Foobar, deleter> unique_ptr;
static unique_ptr factory(DataObject data);
}
Foobar::unique_ptr myFoo = Foobar::factory(data);
//or:
std::shared_ptr<Foobar> myFoo = Foobar::factory(data);
あなたは、彼らがポインタを所有し、クライアントに伝えるためにunqiue_ptrを返しているの?これはまさに私が期待していたものとは正反対です(彼らは明示的に一意のポインタの所有権を取る必要があるからです)。 – jknupp
代わりにmove-semanticsを使用することもできます(C++ 11を使用できる場合)。これにより、工場で作成されたオブジェクトの寿命を延ばす方法を決定するのはユーザーの責任です。 – evnu
@evnuそれはあなたのために自動的に行われるものですか? –