在C++中使用類模板幫助用戶創建類實例
問題的產生
最近工作中使用C++遇到一個問題,我創建了一個管理線程的類ThreadCenter,這個類中包含一個存放Thread類指針的向量,而Thread是一個虛基類,我需要在ThreadCenter類中幫助用戶創建他們的派生類實例,以便確保管理的每個Thread實例都存放於堆內存中,可以安全delete掉。於是我自然而然的想到提供一個接口,讓用戶將他們的類作爲參數傳進來。在我接觸過的像Python,lua這樣的語言中,將類作爲參數傳遞是一件很自然的事兒,在C++中卻不行,怎麼辦。
使用類模板作爲實例工廠
在解決的過程中,我只能感嘆一句,C++果然麻煩。
問題終究是要解決的,我的方法是使用類模板作爲生成實例的工廠。實例工廠的代碼如下:
template<class T>
class ObjectFactory{
public:
static T* produce(){
return new T;
}
private:
ObjectFactory(){}
~ObjectFactory(){}
};
這裏將構造函數和析構函數放到private的原因是這個模板值用來創建其他類的實例,本身並不需要被實例化。
這樣,每次調用實例工廠類的produce()方法,就可以新建一個T類型的實例。比如我有一個類ThreadDerive,通過實例工廠產生實例,可以使用如下代碼:
typedef ObjectFactory<ThreadDerived> ThreadDerivedFactory;
Thread *pt = ThreadDerivedFactory::produce();
這樣,pt就指向了一個新生成的ThreadDerived類的實例。