0

文字列に応じて変数を定義する方法。私は多くのクラスを定義しましたが、文字列に従ってこのクラスの変数を作成したいと思います。

コードは次のようになります。

class AA {};
class BB {};
class CC {
    CC(void *pt);
    virtual ~CC();
};
......

void test(char *ss,void *pt=NULL) {
    //??????How to do?

}

int main() {
    a1=test("AA");    //a1=new AA();
    a2=test("AA");    //a2=new AA();
    b1=test("BB");    //b1=new BB();
    c1=test("CC",pt); //c1=new CC(pt);
}

または、これを URL と見なして関数を処理することもできます。 std::map は、文字列に従ってクラスのインスタンスを取得する一般的なメソッドですが、変数に新しいインスタンスを作成することはできません。文字列に従って新しいインスタンスを取得したいと考えています。

4

3 に答える 3

5

C++ は厳密に型指定された言語であるため、現在のようにこれを行うことはできません。

AA最良のケースとして、に共通の基本クラスを使用してからBBfactoryCCを使用します。次のように書くことはできません。

a1=test("AA");    //a1=new AA();
a2=test("AA");    //a2=new AA();
b1=test("BB");    //b2=new BB();
c1=test("CC",pt); //b2=new CC(pt);

変数の型を定義せずに。

例えば:

class Base{};
class AA : public Base {};
class BB : public Base {};

Base* create(const std::string& what)
{
   if (what == "AA")
       return new AA;
   if (what == "BB")
       return new BB;
   return NULL;
}

int main()
{
    Base* a;
    a = create("AA");
}

または、スマート ポインターを使用する必要があります。そうしないと、自分でメモリを管理する必要があります。

于 2012-09-24T11:38:01.310 に答える
1

おそらく、関数で何かを返すかvoid*、できれば共通ベースへの [スマート] ポインターを返したいと思うでしょう。char const*文字列はおそらく asまたは as として渡す必要がありますstd::string const&。関数内では、引数を直接比較して適切な割り当てを呼び出すかstd::map<std::string, FactoryFunction>、文字列に基づいてファクトリ関数を検索するために を作成します。

于 2012-09-24T11:43:05.750 に答える
0

タイプの文字列名を使用する代わりに、タイプをそのまま使用してください。これを行うには、テンプレートを使用します。

class AA {};
class BB {};
class CC {
public:
    CC(void *pt) {}
    virtual ~CC() {}
};

template <class T>    
T* test() {
    return new T();

}
template <class T>    
T* test(void *pt) {
    return new T(pt);

}

int main() {
    void* pt;
    AA* a1=test<AA>();    //a1=new AA();
    AA* a2=test<AA>();    //a2=new AA();
    BB* b1=test<BB>();    //b1=new BB();
    CC* c1=test<CC>(pt); //c1=new CC(pt);
}
于 2012-09-24T12:07:11.507 に答える