在我的 .NET 项目中,我有一些根据 xml 创建新对象的代码。激活器是使这成为可能的核心。我可以在 C++ 中做类似的事情吗?我找到了一些 IOC/DI 框架,但我真的不需要太多功能。另一种方法当然是简单地编写一个开关,但每次我想出一个新类型时都需要修改(连同 XML)。
问问题
1500 次
2 回答
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;
}
可以通过使用某些人可能会觉得更有吸引力的某种宏魔法来向 factorymap 添加东西。
#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;
}
于 2012-07-20T14:09:10.960 回答