在我的.NET项目中,我有一些代码可以根据xml创建新对象。 Activator是实现这一目标的核心。我在c ++中可以做类似的事情吗?我发现了一些IOC / DI框架,但我真的不需要太多功能。另一种选择当然是简单地编写一个开关,但每次我想出一个新类型时都需要修改它(以及XML)。
答案 0 :(得分:1)
如果你不想要一个开关,你可以沿着这些线滚动你的工厂
#include <map>
#include <string>
class IHasCreate
{
};
typedef IHasCreate* (*CreateFunc)();
std::map<std::string,CreateFunc> factorymap;
class foo : IHasCreate
{
public:
static IHasCreate* CreateFoo()
{
return new foo();
}
};
class bar: IHasCreate
{
public:
static IHasCreate* CreateBar()
{
return new bar();
}
};
IHasCreate* FactoryCreate( const std::string & name )
{
return factorymap[name]();
}
int main()
{
factorymap["foo"] = &foo::CreateFoo;
factorymap["bar"] = &bar::CreateBar;
IHasCreate *fooboject = FactoryCreate("foo");
IHasCreate *barboject = FactoryCreate("bar");
return 0;
}
通过使用某些人可能会觉得更有吸引力的宏观魔法,可以将工件添加到工厂地图中。
#include <map>
#include <string>
class IHasCreate
{
};
typedef IHasCreate* (*CreateFunc)();
std::map<std::string,CreateFunc> factorymap;
bool RegisterType( const std::string& type , CreateFunc func )
{
factorymap[type] = func;
return true;
}
IHasCreate* FactoryCreate( const std::string & name )
{
return factorymap[name]();
}
#define REGISTER(type) \
IHasCreate* type##createfunc() { return new type(); } \
bool type##temp = RegisterType( #type , &type##createfunc);
class foo : public IHasCreate
{
};
REGISTER(foo);
class bar: public IHasCreate
{
};
REGISTER(bar);
int main()
{
IHasCreate *fooboject = FactoryCreate("foo");
IHasCreate *barboject = FactoryCreate("bar");
return 0;
}
答案 1 :(得分:1)