2013-08-20 94 views
2

我發現這個類定義(T具有TBase派生), passResponsabilityToBarDestructor不是 功能的實際名稱,可悲。委託對象破壞

template<typename T> 
class Foo 
{ 
public: 
    Foo(const std::string& aName, Bar& aBar) 
    { 
     const TBase* myObj = static_cast<const TBase*>(new T); 
     NiceNameSpace::passResponsabilityToBarDestructor(aName, myObj, aBar); 
    } 
    virtual ~Foo() {} 
}; 

我想知道它是否設計得很好。 當我寫班,我傾向於避免委託破壞,因爲我不知道委託類(在這種情況下,欄)是否將被修改 不知道的事實passResponsabilityToBarDestructor必須呼籲 成員功能aBar保存指針myObj某處並刪除它 當myObj被破壞。

我想知道:

  1. 如果這個類精心設計的
  2. 如果我的設計工作(當我不能使用智能指針我頭疼試圖 寫類在同一個班摧毀的東西構建它)浪費時間。
+2

如果'T'來自'TBase',則不需要顯式強制轉換:'const TBase * myObj = new T;' – dyp

+0

@DyP謝謝!實際上,我驗證了代碼的用戶使用T的只有來自TBase的類,但也許代碼的作者想要更通用。誰知道... – jimifiki

+1

如果一個類被記錄爲提供服務(在這種情況下是對象刪除服務),請使用它。如果不是,不要。就這麼簡單。 –

回答

2

銷燬代表實際上在許多情況下都有幫助。我遇到過代碼 - 銷燬代價非常大,所以設計人員不希望在調用流程中銷燬對象 - 而是將代理委託給另一個線程級別並在後臺刪除它(理想情況下,系統不忙)。在這種情況下,垃圾收集器(在另一個線程中)銷燬該對象。

這也有時用於快速切換數據(用於數據刷新的情況下)和放心刪除舊數據。我認爲它與Java的gc類似。

關於這個特定的設計是否有效/有用,可能是如果您添加整體概念,它可能會幫助我們添加一些建議。實際上,我在你的問題的第二部分給出了一些提示。 HTH!