在我的 .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   回答