实现此目的的一种方法是对类“名称”映射到工厂函数进行硬编码。模板可能会缩短代码。 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