2017-03-15 12 views
0

私は、データベースからドキュメントを読み込み、その内容をC++クラスのインスタンスに変換するプログラムを作成しています。各ドキュメントには、特定のC++クラスにマッピングする "タイプ"フィールドがあります。基本的には、ドキュメントを読み込み、対応するクラスのオブジェクトを作成し、クラスオブジェクトのフィールドに記入します。私は多分10-15種類のクラスを持っているかもしれません。各文書のデータの種類は異なるかもしれませんが、いくつかの種類は共通しているからです。共通タイプのデータは、ベース/派生クラス定義に反映されます。今、私はcase文を使ってswitch文を作成し、それぞれの型のオブジェクトに対応しています。それぞれの文で適切な種類のオブジェクトを作成し、それを埋めています。クラス定義の配列を使用してC++クラスを作成する

さまざまなクラス定義を配列に配置して、switch文をほとんど取り除くことができるかどうかは疑問でした。 arrayOfClassDefinitionsは、クラスのセットの名前が含まれています[typeofClassIndex]

自動* OBJ =新しいarrayOfClassDefinitions:私の理想的なコードは次のようになります。次いで、objポインタは、所望のクラスの新たなインスタンス化を指示する。

私はこのようなことをPythonで行うことができますが、C++についてはわかりません。

任意のアイデア??

+0

"さまざまなクラス定義を配列に配置する"とはどういう意味ですか? _class定義_はテキストです。 – ForceBru

+3

短い答えは:C++はこのように動作しません。 –

+0

配列には、すべての要素に対して同じデータ型が格納されます。インジケーションは、基本クラス型へのポインタの配列を作成して個々のオブジェクトを指すようにすることができますが、それがあなたが探しているものかどうかはわかりません。 – user3336523

答えて

1

すべてのクラスを1つの階層ツリーにまとめることができる場合は、Abstract factory patternを使用して同様の結果を得ることができます。例:

#include <map> 
#include <memory> 

class IBaseClass { 
public: 
    virtual ~IBaseClass(){} 
}; 

class A : public IBaseClass { 
public: 
// .... 
}; 

class B : public IBaseClass { 
public: 
// .... 
}; 

class C : public IBaseClass { 
public: 
// .... 
}; 

class IFactory { 
    public: 
    virtual ~IFactory(){} 

    virtual IBaseClass* create() = 0; 
}; 

template <class T> 
class SimpleFactory : 
    public IFactory { 
public: 
    IBaseClass* create() override { 
     return new T(); 
    } 
}; 

template <typename T> 
std::shared_ptr<IFactory> make_factory() { 
    return std::make_shared<SimpleFactory<T> >(); 

} 

int main(int, char**) 
{ 
    std::map<int, std::shared_ptr<IFactory>> factories = { 
     {1, make_factory<A>()}, 
     {2, make_factory<B>()}, 
     {3, make_factory<C>()} 
    }; 

    // .... 

    int type_index = 1; 
    auto obj = factories[type_index]->create(); 
    // ... 
    // don't forget to delete 
    delete obj; 
    return 0; 
} 
+0

提案してくれてありがとう、ファクトリ関数は私が望むことをするように見えます。 –

関連する問題