3

在我的 .NET 项目中,我有一些根据 xml 创建新对象的代码。激活器是使这成为可能的核心。我可以在 C++ 中做类似的事情吗?我找到了一些 IOC/DI 框架,但我真的不需要太多功能。另一种方法当然是简单地编写一个开关,但每次我想出一个新类型时都需要修改(连同 XML)。

4

2 回答 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 回答
1

“超级工厂”最酷的 C++ 实现是我的好朋友 Francis 的一个,你可以在 CodeProject 上找到这篇文章。

我相信他写这家工厂时正是考虑到了这种需求。它还支持他的(反)序列化框架Daabli,该框架读取纯文本 C 样式(以及一些工作 - JSON、XML)文件并重新创建对象图。

希望这可以帮助!

于 2012-07-20T14:33:57.067 回答