专用模板类循环依赖

时间:2013-02-24 15:19:28

标签: c++ templates header-files template-specialization

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

有什么好建议吗?

编辑:转发声明在这里没用,因为即使添加了f.d.在A.h中的B并将方法virtual B * getB()放在A中,作为AImpl的模板类,它需要该方法的完整定义。 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,反之亦然,这导致了循环依赖。请注意,这不是我所拥有的,但显示了同样的问题。谢谢。

1 个答案:

答案 0 :(得分:1)

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

尝试将它放在A.h:

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

然后你可以在B.h。

中加入A.h.