困難な設計上の問題があり、アドバイスを求めています。簡単に言うと、 と 、 と 、 と をそれぞれ継承する 2 つのA
基本B
クラスがAImpl<T>
ありBImpl<T>
ます。私が必要とするのは、ポリモーフィックポインターが指すオブジェクトから(静的) を取得することですが、 in のようなものを明示的に追加してオーバーライドする必要はありません。とは両方とも、std::stringなどのプリミティブ型に特化しています。A
B
BImpl<T>*
AImpl<T>
A*
virtual B* getB()
A
AImpl<T>
B
BImpl<T>
A
AImpl<T>
BImpl<T>
T*
良いアドバイスはありますか?
編集: 前方宣言はここでは役に立ちません。B の fd を Ah に追加し、メソッド virtual B* getB() を A に配置しても、AImpl がテンプレート クラスであるため、メソッドの完全な定義が必要になるためです。getB() は、BImpl の静的インスタンスを返す必要があります。
この問題を別の言葉で説明すると、次のようになります。ユーザー cpp に Ah を含め、A クラスを使用します。AImpl にメソッド getB() が次のように定義されているとします。
const B* getB() const {
static BImpl<T> instance;
return &instance;
}
この方法では Bh を完全に含める必要があり、循環依存につながります。
編集 2、完全 なコード例 私の懸念をよりよく説明することを期待して、簡単なコード例にしようと思います。
// File A.h
struct A
{
virtual ~A();
void const A* getChild() const { /* ... */}
virtual const B* getB() const = 0;
};
template <typename T>
struct AImpl : public A
{
const B* getB() const
{
return getBImpl_of<T>();
}
};
// Specializations of AImpl<T>
template<typename T>
const A* getAImpl_of()
{
static AImpl<T> instance;
return &instance;
}
// File B.h
struct B
{
template<typename T>
static void work()
{
getBImpl_of<T>()->doWork();
}
virtual ~B();
protected:
virtual void doWork() = 0;
};
template <typename T>
struct BImpl : public B
{
protected:
void doWork()
{
const A* pA = getAImpl_of<T>();
// ... do something with pA ...
// Here is the key point:
const A* pChild = pA->getChild();
pChild->getB()->doWork();
}
};
template<typename T>
const B* getBImpl_of()
{
static BImpl<T> instance;
return &instance;
}
これは私がやりたいことですが、明らかに Ah を Bh に含めたり、その逆を行ったりすると循環依存につながります。これは私が持っているものとまったく同じではありませんが、同じ問題を示していることに注意してください。ありがとうございました。