1

私はいくつかのクラスを持っています:

class Base
{
public:
    virtual void Something() = 0;
}

class A : public Base
{
public:
    virtual void Something() { /*...*/ }
    void SpecialActionForA();
}

class B : public Base
{
public:
    virtual void Something() { /*...*/ }
    void SpecialActionForB();
}

そして配列:

Base* MyMembers[2];
MyMembers[0] = new A;
MyMembers[1] = new B;

そして私はやりたい:

A* pointer_to_a = Get(0);
B* pointer_to_b = Get(1);

Get()この機能を実装する良い方法はありますか?


私の解決策は次のとおりです。

template <typename T>
T* Get(int index)
{
    return dynamic_cast<T*>(MyMembers[index]);
}

しかし、最初に私が書かなければならないのは

A* pointer_to_a = Get<A>(0)

追加の<A>;が必要です。

2 つ目は、何らかの形で次のnewように失敗した場合です。

MyMembers[0] = new B;

その後、Get()失敗しました。
私が欲しいのは、インデックス 0 を A にマップできる自動メカニズムのようなものです。


追加の詳細: 実際には、80派生したさまざまなクラスBase(それらは私のユーザー インターフェイスです) が
あり、実際のクラス (実際の UI) を取得して処理を実行する必要があります。

私が使用する必要がある機能は上記のSpecialActionForA()...などです。

Something()も使用されますが、これらの UI の初期化段階、または UI マネージャー システムによって管理されるものです。

4

3 に答える 3

1

関数のオーバーロードは、引数リストを検索することで機能します。戻り値の型だけを判断して、どのような値が必要かを理解することはできません。したがって、コンパイラは、テンプレートをインスタンス化するために追加の詳細を提供することを強制します。したがって、オプションは次のとおりです。

Base *Get(int N) {
    return MyMembers[N];
}

また

A *GetA(int N) {
   return MyMembers[N];
}
B *GetB(int N) {
   return MyMembers[N];
}

また

template <typename T> void Get(int N, T *&item) {
   item = (T*)MyMembers[N];
}
A* pointer_to_a; 
B* pointer_to_b; 
Get(0, pointer_to_a);
Get(1, pointer_to_b);

またはあなた自身の

template <typename T>
T* Get(int index)
{
    return dynamic_cast<T*>(MyMembers[index]);
}
于 2013-10-31T03:20:49.160 に答える
1

unknown* Get(int)同じ名前で戻り値だけが異なる2つ以上の関数が必要になるため、原則として行うことはできません。C++ はこれを明示的に禁止しています。

あなたが得ることができる最も近い関数はこれです:

template <typename T> T* Get() {
  static T* instance = new T;
  return instance;
}

したがって、次のように使用できます。

A *a = Get<A>(); 
B *b = Get<B>();
于 2013-10-31T03:26:35.677 に答える