2012-01-31 74 views
2

在我目前的代碼,我是從enable_shared_from_this派生的TNCPConnection類:CRTP模式和enable_shared_from_this

class TNCPConnection : public boost::enable_shared_from_this<TNCPConnection> { ... }; 

現在我需要創建一個第二類ETCPConnection將與現有TNCPConnection同學分享了很多代碼。所以明顯的解決方案是有一個抽象基類CPConnectionBase,它實現了通用功能。

我知道繼承層次結構中只有一個類可以從enable_shared_from_this派生。在尋找解決方案時,我偶然發現了CRTP模式,但我不確定是否正確理解了這一點。這是我的方法:

template <class Derived> 
class CPConnectionBase : public boost::enable_shared_from_this<Derived> 
{ 
public: 

    CPConnectionBase(void) { } 
    virtual ~CPConnectionBase(void) = 0 { } 
}; 

class TNCPConnection : public CPConnectionBase<TNCPConnection> { ... }; 

class ETCPConnection : public CPConnectionBase<ETCPConnection> { ... }; 

這是解決我的問題的正確方法嗎?引用計數能否正確地使用這種方法?特別是我想知道enable_shared_from_this的模板參數是否必須是Derived(如上例所示)或類似CPConnectionBase<Derived>

回答

2

如果使用這種方法,每個派生類將擁有自己獨特的基類。即使它們具有相同的名稱,它們也會是不同的實例。你確定從enable_shared_from_this繼承的基類不會爲所有的孩子提供能力嗎?

另外,which will share a lot of code with the existing ... class.而不是立即指示使用繼承。一般來說,繼承來擴展,而不是重用。如果所有的基類都實現了通用功能,但沒有爲這兩個類提供通用接口,那麼您應該重新考慮這種方法。可以使用常用方法的組合和委派,或者,如果它們沒有連續狀態,則將公用代碼放入(可能是匿名的)名稱空間中,並從您需要的實際功能類中調用它們。你還沒有提供足夠的信息來確定你想要做什麼。