2

我有一个令人生畏的设计问题,我正在乞求一些建议。简而言之,我有两个基类Aand B, and AImpl<T>, and分别BImpl<T>继承自Aand B。我需要的是BImpl<T>*AImpl<T>多态指针指向的对象中检索(静态) A*,但没有显式添加类似virtual B* getB()inA并覆盖它,AImpl<T>因为B并且BImpl<T>已经依赖于A并且会添加循环依赖。两者AImpl<T>BImpl<T>都专门用于原始类型,std::stringT*等。

有什么好的建议吗?

编辑:前向声明在这里没有用,因为即使在 Ah 中添加 B 的 fd 并将方法 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;
}

这是我想做的,但显然在 Bh 中包含 Ah,反之亦然会导致循环依赖。请注意,这不完全是我所拥有的,但显示了同样的问题。谢谢你。

4

1 回答 1

1

前向声明应该没问题,因为模板方法在使用之前不会被实例化。

试着把它放在你的 Ah 的顶部:

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

那么你可以在 Bh 中包含 Ah

于 2013-02-24T15:57:48.920 回答