從一個工廠方法返回一個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