0

与えられた:

クラスAのオブジェクトには、オブジェクトの配列が含まれています。

AはIBのメソッドを使用するため、これらの各オブジェクトは何らかのインターフェイスIBを実装する必要があります。

これらのオブジェクトは、クライアントによってクラスAのオブジェクトに渡され、タイプCまたはその子です。これらのオブジェクトをクライアントに返す必要があります。

問題:AはCについて何も知らなくてはならず、IBについてのみ知っている必要がありますが、AはCを返す必要があります。

安全でないキャスト<>のないC++の標準ソリューションはありますか?

4

2 に答える 2

0

について何もA知らなければ、これは不可能だと思います。ただし、適切なインターフェイスを使用するのに十分な知識を持つことは、C++ ではそれほど難しくありません。純粋な仮想関数として定義されたインターフェイスを持つ単一の抽象基本クラスからすべてのクラスを派生させます。これは実際には、 Sutter & Alexandrescuなどで説明されているように、適切な C++ 設計 (実装からインターフェイスを分離する) に対応しています。CAIB

それ以外の場合、上記が本当に不可能な場合はA、テンプレート クラスを作成し、配列要素を として格納し、void*(コンパイル時に) を使用してクラス タイプを解決することができますstatic_cast

于 2012-07-25T15:44:49.320 に答える
0

テンプレートを使用して、完全に安全なクラスを実装できます。

template  <typename T>class A
{
    std::vector<IB*> myObj;

public:


    void add(IB* anObj)
    {
        myObj.push_back(anObj);
    }

    void get(int anIndex, T*& anObj)
    {
        T* t = dynamic_cast<T*>(myObj[anIndex]);
        anObj = t;
    }
};

そして、このように使用します。

A<C> a;

デモはこちら

于 2012-07-25T15:51:19.607 に答える