實現此目的的一種方法是對類「名稱」映射到工廠函數進行硬編碼。模板可能會縮短代碼。 STL可以使編碼更容易。
#include "BaseObject.h"
#include "CommonClasses.h"
template< typename T > BaseObject* fCreate(int param1, bool param2) {
return new T(param1, param2);
}
typedef BaseObject* (*tConstructor)(int param1, bool param2);
struct Mapping { string classname; tConstructor constructor;
pair<string,tConstructor> makepair()const {
return make_pair(classname, constructor);
}
} mapping[] =
{ { "class1", &fCreate<Class1> }
, { "class2", &fCreate<Class2> }
// , ...
};
map< string, constructor > constructors;
transform(mapping, mapping+_countof(mapping),
inserter(constructors, constructors.begin()),
mem_fun_ref(&Mapping::makepair));
編輯 - 在一般請求:)有點返工,使事情看起來更平滑(學分石免費誰沒有可能要添加一個答案本人)
typedef BaseObject* (*tConstructor)(int param1, bool param2);
struct Mapping {
string classname;
tConstructor constructor;
operator pair<string,tConstructor>() const {
return make_pair(classname, constructor);
}
} mapping[] =
{ { "class1", &fCreate<Class1> }
, { "class2", &fCreate<Class2> }
// , ...
};
static const map< string, constructor > constructors(
begin(mapping), end(mapping)); // added a flavor of C++0x, too.
「擴展版本(允許獨立的代碼段註冊它們的類)將是一個映射<名稱,工廠函數指針>。」 從類定義中可以將自己註冊到該映射中,假設該映射位於其他地方的Factory中? 在Java中,我可以/使用靜態構造函數來完成它。實際上,我不想爲我編寫的每個新子類修改Factory的代碼。 – puccio 2009-07-08 08:15:09