2

困難な設計上の問題があり、アドバイスを求めています。簡単に言うと、 と 、 と 、 と をそれぞれ継承する 2 つのA基本BクラスがAImpl<T>ありBImpl<T>ます。私が必要とするのは、ポリモーフィックポインターが指すオブジェクトから(静的) を取得することですが、 in のようなものを明示的に追加してオーバーライドする必要はありません。とは両方とも、std::stringなどのプリミティブ型に特化しています。ABBImpl<T>*AImpl<T>A*virtual B* getB()AAImpl<T>BBImpl<T>AAImpl<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 に含めたり、その逆を行ったりすると循環依存につながります。これは私が持っているものとまったく同じではありませんが、同じ問題を示していることに注意してください。ありがとうございました。

4

1 に答える 1

1

テンプレートメソッドは使用されるまでインスタンス化されないため、前方宣言は問題ありません。

これをあなたのああの一番上に置いてみてください:

struct B;
template <typename T> const B* getBImpl_of();

次に、Bh内からAhを含めることができます

于 2013-02-24T15:57:48.920 に答える