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

Circular dependency issues with inheritance and returning instances

本文关键字:循环 依赖性 问题 实例 返回 继承      更新时间:2023-10-16

我在单独的头文件中有两个类:

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的定义下。