从工厂方法返回 astd::unique_ptr
很好,应该是推荐的做法。它传达的信息是(IMO):您现在是该对象的唯一所有者。此外,为了您的方便,该对象知道如何销毁自己。
我认为这比返回一个原始指针要好得多(客户端必须记住如何以及是否处理该指针)。
但是,我不明白您关于释放指针以延长其寿命的评论。一般来说,我很少看到调用智能指针的任何理由release
,因为我认为指针应该始终由某种 RAII 结构管理(我调用的唯一情况release
是将指针放在不同的管理数据结构中,unique_ptr
例如一个不同的删除器,在我做了一些需要额外清理的事情之后)。
因此,只要客户需要对象(或 a ,如果他们需要指针的多个副本),客户就可以(并且应该)简单地存储unique_ptr
某处(例如 another 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)添加一个到您的工厂对象。如果您以后决定更改指针的分配,这会更容易(因此需要一种不同的方法来销毁指针,这将作为 的第二个模板参数可见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);