ファクトリ メソッドから a を返すことstd::unique_ptr
は問題なく、推奨される方法です。それが伝えるメッセージは (IMO):あなたは現在、このオブジェクトの唯一の所有者です。さらに、便宜上、オブジェクトは自分自身を破壊する方法を知っています。
これは、生のポインターを返すよりもはるかに優れていると思います (クライアントは、このポインターを破棄する方法と破棄するかどうかを覚えておく必要があります)。
ただし、ポインターを解放して寿命を延ばすことについてのあなたのコメントは理解できません。一般に、スマートポインターを呼び出す理由はめったにありませrelease
ん。ポインターは常にある種の RAII 構造によって管理されるべきだと思うからです (私が呼び出す唯一の状況はrelease
、ポインターを別の管理データ構造に置くことですunique_ptr
。追加のクリーンアップを保証するために何かをした後、別の削除者) .
したがって、クライアントは、オブジェクト (または、ポインターの複数のコピーが必要な場合はa)が必要な限り、単にunique_ptr
どこかに (返されたものから移動して構築された別の など) を格納できます (また、格納する必要があります)。したがって、クライアント側のコードは次のようになります。unique_ptr
shared_ptr
std::unique_ptr<FooBar> myFoo = Foobar::factory(data);
//or:
std::shared_ptr<FooBar> myFoo = Foobar::factory(data);
個人的にはtypedef
、返されたポインタ型 (この場合はstd::unique_ptr<Foobar>
) や使用された削除機能 (この場合は 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);