2010-08-28 62 views
1

我在加速C++並編寫一個簡單的Handle類作爲智能指針的示例。這使用virtual ctor idiom使用虛擬clone()函數。到現在爲止還挺好。但是當我想用我的Handle來控制那些不提供clone()的類時該怎麼辦?如何爲沒有clone()成員的類編寫句柄?

的方法在書中建議是建立一個全球性的clone功能和使用模板特(東西我看到的第一次),這樣,如果clone()被稱爲與一個特定的參數,可以編寫代碼來處理這種情況。

我的問題是:這意味着我必須寫一個clone()版本型類的,我想像我的用戶可以使用Handle用。這似乎很難!有沒有更優雅和/或簡單的方法來解決這個問題? auto_ptr或boost :: shared_ptr之類的東西有可能在沒有繁瑣的clone()定義的情況下提供此功能?

爲了完整起見,這裏是我的Handle類實現:

template <class T> class Handle 
{ 
public: 
    Handle() : p(0) {} 
    Handle(T* t) : p(t) {} 
    Handle(const Handle& s) :p(0) { if (s.p) p = s.p->clone(); } 
    const Handle& operator=(const Handle&); 
    ~Handle() { delete p; } 

    operator bool() { return p; } 

    T& operator*() { if (p) return *p; else throw std::runtime_error("Handle not bound"); } 
    T* operator->() { if (p) return p; else throw std::runtime_error("Handle not bound"); } 
private: 
    T* p; 
}; 

謝謝!

+1

使用clone()不是非常類似C++。 – 2010-08-29 00:58:53

回答

2

這個問題的解決方案是簡單地不寫Handle s這些類。不完全是。

auto_ptr(不推薦使用C++ 11)不需要克隆底層對象,因爲auto_ptr從不復制對象。一個auto_ptr只有一個對象的副本,並且當auto_ptr被複制時,該對象的控制被轉移 - 該對象不被複制。

unique_ptr永遠不需要克隆底層對象,因爲只有一個擁有該對象的unique_ptrunique_ptr是不可複製的,只能移動。

shared_ptr永遠不需要克隆,因爲它也只控制對象的一個​​副本。複製shared_ptr只會增加引用計數,並且引用計數爲零時該單個對象將被銷燬。

一般來說,如果沒有辦法深度拷貝你的類正在控制的資源,那麼你應該讓這個類不可複製。如果客戶需要將參考文件傳遞給您的班級,他們可以將班級放置在auto_ptr,unique_ptrshared_ptr本身。

相關問題