1

クライアントコードで使用すべきではない内部オブジェクトがあります:

class InternalA {};
class InternalB {};

パブリック インターフェイス オブジェクト A、B、C があります。内部的には、A から InternalA、B から InternalB というオブジェクトを構築する必要がありますが、A と B には、基本クラス C へのポインターによってのみアクセスできます。共変仮想メソッドを使用できますが、したがって、私の内部は公開され、InternalA と InternalB は実際には同じ基本クラスの 2 つのサブタイプではありません。または私はそのようなことをすることができます:

class C {
    // some data
public:
    C() {};
    // some pure virtual methods and virtual methods
virtual C *getConcrete(void) const =0;

};

class B : C {
public:
    //methods
    virtual B *getConcrete(void) { return static_cast<B>(this); };
};

class A : C {
public:
    //methods
    virtual A *getConcrete(void) { return static_cast<A>(this); };
};

次に、A または B パラメータでポリモーフィック メソッドを使用して内部ビルダーを使用します。

編集:InternalAとInternalBを構築するには、そのような関数/メソッドを使用できます:

void somefunction(A *a) {
    InternalA x(<using a->smthg>);
    // do stuffs
};
void somefunction(B *b) {
    InternalB x(using b->smthg>);
   //do stuffs

};

このハックについてどう思いますか?

4

1 に答える 1

0

のみを使用してこの問題を解決することは不可能だと思いますclass C。ビルドするには、AInternalAまたはInternalBB に関する知識が必要です。ビルダー定義では、A または B を定義する必要があります。だから私はあなたが使うべきだと思いますdynamic_castdynamic_castまたは、禁止されている場合、仮想関数によって実装されたある種のタイプ ID 。

#include "A.h"

......

InternalA* buildInternalA(const C* c) {
    const A* a = dynamic_cast<const A*>(c);
    if (a)
        return new InternalA(a);
    return 0;
}

ただし、builder を使用する場合 (他の cpp ファイル内)、A と B の定義は必要なく、builder の宣言のみが必要です。

class InternalA;
class C;
InternalA* buildInternalA(const C* c);
于 2012-06-26T09:34:59.250 に答える