专用模板类循环依赖关系

Specialized template classes cyclic dependency

本文关键字:依赖 关系 循环 专用      更新时间:2023-10-16

我有一个令人生畏的设计问题,我正在寻求一些建议。简而言之,我有两个基类AB,以及分别继承自ABAImpl<T>BImpl<T>。我需要的是从多态A*指针指向的AImpl<T>对象中检索一个(静态)BImpl<T>*,但不需要在A中显式添加类似virtual B* getB()的内容,并在AImpl<T>中覆盖它,因为BBImpl<T>已经依赖于A,这将添加循环依赖关系。AImpl<T>BImpl<T>都专门用于基元类型,std::string、T*等。

有什么好建议吗?

Edit:forward声明在这里没有用处,因为即使在A.h中添加B的f.d.,并将方法virtual B*getB()放在A中,作为一个模板类,它也需要对该方法进行完整的定义。getB()应该返回一个BImpl的静态实例。

为了用其他术语解释这个问题,会发生以下情况:在用户cpp中,我包含a.h并使用a类。假设AImpl将方法getB()定义为

const B* getB() const {
   static BImpl<T> instance;
   return &instance;
}

这种方法需要完全包含B.h,从而导致循环依赖性。

编辑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;
}

这是我想做的,但很明显,在B.h中包含A.h,反之亦然会导致循环依赖。请注意,这并不完全是我所拥有的,但显示了相同的问题。非常感谢。

Forward声明应该很好,因为模板方法在使用之前不会实例化。

试着把这个放在你的A.h:的顶部

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

则可以在B.h中包含A.h。