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

C++ 继承和返回实例的循环依赖性问题,c++,inheritance,circular-dependency,forward-declaration,C++,Inheritance,Circular Dependency,Forward Declaration,我在单独的标题中有两个类: struct A { virtual B getB(); } template<typename T> struct Basic : public A { } typedef Basic<int> B; 结构A{ 虚拟B getB(); } 模板 结构基本:公共A{ } typedef基本B; 这两个头都需要包含彼此,由于循环依赖性,这并不理想。 但是,A::getB()返回一个实例,因此我不能向前声明以避免包含,而Basic继承

我在单独的标题中有两个类:

struct A {
    virtual B getB();
}

template<typename T>
struct Basic : public A {
}
typedef Basic<int> B;
结构A{ 虚拟B getB(); } 模板 结构基本:公共A{ } typedef基本B; 这两个头都需要包含彼此,由于循环依赖性,这并不理想。 但是,A::getB()返回一个实例,因此我不能向前声明以避免包含,而Basic继承了A,因此这里的处理是相同的。Basic必须继承A,但A不需要getB()函数(尽管这是非常可取的)。
我必须避免循环依赖,但我是否走错了方向

注意:A类将被后面的许多其他类继承,因此getB()是虚拟的。Basic是一个模板类,所以它的定义也在它的头中。getB()必须返回一个实例(从getB()出来的任何东西都应该是getB()的本地对象,这就是它不能返回指针或引用的原因)。

执行以下操作:

struct A {
    virtual B* getB();
}
template <typename> struct Basic;
typedef Basic<int> B;

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;
}
template-struct-Basic;
typedef基本B;
结构A{
虚拟B getB();
};
模板
结构基本:公共A{
};
//下面是结构A的成员函数定义!!!
B A::getB(){B B;返回B;}
int main()
{
A A;
B B;
返回0;
}
但是请记住,
struct A
的成员函数定义必须在
struct B
的定义下执行以下操作:

struct A {
    virtual B* getB();
}
template <typename> struct Basic;
typedef Basic<int> B;

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;
}
template-struct-Basic;
typedef基本B;
结构A{
虚拟B getB();
};
模板
结构基本:公共A{
};
//下面是结构A的成员函数定义!!!
B A::getB(){B B;返回B;}
int main()
{
A A;
B B;
返回0;
}

但是请记住,
struct A
的成员函数定义必须在
struct B
的定义下,如果按值返回,则可以向前声明

因此,在您的示例中,您必须执行以下操作:

struct A {
    virtual B* getB();
}
template <typename> struct Basic;
typedef Basic<int> B;

struct A {
    virtual B getB();
};
template-struct-Basic;
typedef基本B;
结构A{
虚拟B getB();
};

如果按值返回,则可以向前声明

因此,在您的示例中,您必须执行以下操作:

struct A {
    virtual B* getB();
}
template <typename> struct Basic;
typedef Basic<int> B;

struct A {
    virtual B getB();
};
template-struct-Basic;
typedef基本B;
结构A{
虚拟B getB();
};

在“Note:”下澄清。在“Note:”下澄清。编译器在返回B时是否不需要知道B的大小,直到它被定义?仅当您调用
getB()
时,编译器在返回B时不需要知道B的大小,直到它被定义?仅当您调用
getB()