我有一个令人生畏的设计问题,我正在乞求一些建议。简而言之,我有两个基类A
and B
, and AImpl<T>
, and分别BImpl<T>
继承自A
and 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,反之亦然会导致循环依赖。请注意,这不完全是我所拥有的,但显示了同样的问题。谢谢你。