从一个工厂方法返回一个std::unique_ptr
是蛮好的,应该是一个值得推荐的做法。它传递的信息是(IMO):您现在是此物件的唯一拥有者。此外,为了您的方便,对象知道如何摧毁自己。
我认为这比返回一个原始指针(客户端必须记住如何以及如何处理这个指针)好得多。
但是我不明白你的关于释放指针延长它的生命周期评价。总的来说,我很少看到任何理由骂release
在智能指针,因为我觉得指针应该总是通过某种RAII结构(只是这里我打电话release
是把指针在不同的管理数据结构的唯一情况,例如管理一个unique_ptr
与一个不同的删除器,后我做了一些事情,以保证额外的清理)。
因此,客户端可以(也应该)仅存储所述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)至你的工厂对象。如果稍后决定更改指针的分配(因此需要使用另一种销毁指针的方法,该指针将作为第二个模板参数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 2012-01-03 21:54:53
您可能想使用移动语义(如果您能够使用C++ 11)。有了这个,用户可以决定如何延长工厂创建的对象的生命周期。 – evnu 2012-01-03 21:57:35
@evnu这是你自动完成的事情,不是吗? – 2012-01-03 22:20:09