我在不同的标题中有两个类:
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()的东西都应该是getB()的本地,这就是它不能返回指针或引用的原因。
答案 0 :(得分:2)
执行以下操作:
struct A {
virtual B* getB();
}
也就是说,struct A
必须仅通过指针引用struct B
。然后,您可以通过在struct B
定义之前声明struct A
来解决问题。
澄清后更新:
您可以执行以下操作:
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
的定义下。
答案 1 :(得分:2)
如果按值返回,您可以转发声明。
因此,在您的示例中,您必须执行以下操作:
template <typename> struct Basic;
typedef Basic<int> B;
struct A {
virtual B getB();
};