继承和返回实例的循环依赖性问题
Circular dependency issues with inheritance and returning instances
我在单独的头文件中有两个类:
struct A {
virtual B getB();
}
template<typename T>
struct Basic : public A {
}
typedef Basic<int> B;
两个标头都需要相互包含,由于循环依赖性,这并不理想。但是,A::getB()返回一个实例,所以我不能转发声明以避免include,而Basic继承了A,所以在那里也是一样的。Basic必须继承A,但A不需要getB()函数(尽管它是非常可取的)
我必须避免循环依赖,但我是不是走错了路?
注意:A类将被后面的许多其他类继承,因此getB()是虚拟的。Basic是一个模板类,所以它的定义也在它的头中。getB()必须返回一个实例(从getB(。
如果按值返回,则可以转发声明。
因此,在您的示例中,您必须执行以下操作:
template <typename> struct Basic;
typedef Basic<int> B;
struct A {
virtual B getB();
};
执行以下操作:
struct A {
virtual B* getB();
}
也就是说,struct A
必须仅通过指针来引用struct B
。然后可以通过在定义struct A
之前前向声明struct B
来解决问题。
澄清后更新:
你可以做如下操作:
template <typename> struct Basic;
typedef Basic<int> B;
struct A {
virtual B getB();
};
template<typename T>
struct Basic : public A {
};
// definitions of member functions for struct A below here!!!
B A::getB() { B b; return b;}
int main()
{
A a;
B b;
return 0;
}
请记住,struct A
的成员函数的定义必须在struct B
的定义下。
相关文章: