2

C ++では、クラスBaseをインターフェイスクラスと2つの継承クラスとして持っています:Base1そして、このようなクラスBase2から:Base

class Base{
    public:
        virtual void printSomething() = 0;
    // Some bla bla code...
};

class Base1 : public Base{
    public:
        Base1();
        void printSomething(); 
};


class Base2 : public Base{
    public:
        Base2();
        void printSomething(); 
};

通常、私の main.cpp には、次のコードを含める必要があります。

Base *b;
string base_name = "Base1"; // or "Base2" 
if(base_name.compare("Base1") == 0){
     b = new Base1();
}else{
     b = new Base2();
}

だから、上のブロックのBase *b = base_name()代わりに使いたい 。if()else()C ++では、これは可能ですか?ありがとう!

4

3 に答える 3

6

Java とは異なり、C++ はリフレクションの概念をネイティブでサポートしていません。Base特定のインスタンスを構築する単純な関数を作成できます。これはFactoryと呼ばれます:

Base* create_base_instance(string name) {
  if (name == "Base1")
    return new Base1();
  if (name == "Base2")
    return new Base2();
  throw runtime_error("unknown class name");
}

Base *b;
string base_name = "Base1"; // or "Base2" 
b = create_base_instance(base_name);
于 2012-06-12T03:32:42.613 に答える
3

短い答えはノーです。長い答えは次のとおりです。慣用的な解決策が必要な場合は、Factory Method設計パターンを調べてください。

別のアプローチ: マップ内の文字列によってキー設定されたプロキシ オブジェクトを保持し、そのマップを使用してこれらのプロキシ オブジェクトを作成する (必要に応じてクローンを作成する) ことができます。このメソッドは、比較をエンド ユーザーから隠し、標準ライブラリ コンテナーの奥深くにプッシュします。

于 2012-06-12T03:32:49.717 に答える
1

std::map を使用してファクトリ パターンを実装します。

template<typename T>
struct Factory
{
    static Base* Create()
    {
        return new T();
    }
};

typedef std::map<std::string, Base* (*)()> FunMap;
FunMap fun;

void Register()
{
    fun.insert(std::pair<std::string, Base*(*)()>("Derived1", Factory<Derived1>::Create));
    fun.insert(std::pair<std::string, Base*(*)()>("Derived2", Factory<Derived2>::Create));
}


void CreateTypeDemo2(const std::string& name)
{
    Base* bp = fun[name]();
    bp->Name();
}

main から、この方法で関数を呼び出すことができます。

Register();
CreateTypeDemo2("Derived1");
CreateTypeDemo2("Derived2");

以下に示すようにそれを行うこともできます。メソッドでは、 Factory::Create が提供CreateDerived2するデフォルトの実装ではなく、Derived2() を作成する別の実装を使用できます。

Base* CreateDerived2()
{
    return new Derived2();
}

void Register()
{
    fun.insert(std::pair<std::string, Base*(*)()>("Derived1",Factory<Derived1>::Create));
    fun.insert(std::pair<std::string, Base*(*)()>("Derived2",CreateDerived2));
}

お役に立てれば。

于 2012-06-12T06:46:28.393 に答える