繁体   English   中英

专门的模板类循环依赖

[英]Specialized template classes cyclic dependency

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

有什么好的建议吗?

编辑 :向前声明在这里没有用,因为即使在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,反之亦然,这会导致循环依赖性。 请注意,这不完全是我所拥有的,但是显示了相同的问题。 谢谢。

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

尝试将其放在您的Ah顶部:

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

那么您可以在Bh中包含Ah

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM