我有一个令人生畏的设计问题,现在正在寻求一些建议。简而言之,我有两个基类A
和B
,以及AImpl<T>
和BImpl<T>
分别继承自A
和B
。我需要的是从由多态BImpl<T>*
指针指向的AImpl<T>
对象中检索(静态)A*
,但无需在virtual B* getB()
中明确添加类似A
的内容并在AImpl<T>
中覆盖它,因为B
和BImpl<T>
已经取决于A
了,这将添加一个循环依赖性。 AImpl<T>
和BImpl<T>
都专用于基本类型,例如std::string,T*
等。
有什么好的建议吗?
编辑:前向声明在这里没有用,因为即使加上f.d。将A.h中B的值作为对象并将A中的虚拟B * getB()方法作为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,反之亦然会导致循环依赖性。请注意,这不完全是我所拥有的,但是显示了相同的问题。谢谢。
最佳答案
前向声明应该很好,因为在使用模板方法之前不会实例化它们。
尝试将其放在A.h的顶部:
struct B;
template <typename T> const B* getBImpl_of();
那么您可以在B.h中包含A.h。
关于c++ - 专门的模板类循环依赖,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15053168/