3

私の .NET プロジェクトには、xml に従って新しいオブジェクトを作成するコードがいくつかあります。Activator は、これを可能にする心臓部です。C ++でできる同様のことはありますか? IOC/DI フレームワークをいくつか見つけましたが、あまり機能は必要ありません。別の方法としてはもちろん、単純にスイッチを記述することですが、新しい型を思いつくたびに (XML と共に) 変更する必要があります。

4

2 に答える 2

1

"superfactory" の最もクールな C++ 実装は、私の良き友人である Francis によるもので、 CodeProjectで記事を見つけることができます。

彼はまさにこの必要性を念頭に置いてこの工場を書いたと思います。また、彼の (デ) シリアル化フレームワークDaabliを強化します。Daabli は、プレーンテキストの C スタイル (およびいくつかの作業 - JSON、XML) ファイルを読み取り、オブジェクト グラフを再作成します。

お役に立てれば!

于 2012-07-20T14:33:57.067 に答える
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 に答える