继承和返回实例的循环依赖问题

时间:2014-04-17 02:50:39

标签: c++ inheritance circular-dependency forward-declaration

我在不同的标题中有两个类:

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()的本地,这就是它不能返回指针或引用的原因。

2 个答案:

答案 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();
};