是否可以进行相互递归的类?

时间:2012-01-12 14:46:43

标签: c++ class recursion declaration definition

我使用前向声明阅读how this can be made to work

class A
{
    public:
    B *objB;

    void foo(){}
}

class B
{
    public:
    A *objA;

    void foo(){}
}

只想确认这种设计是否可行?

class A
{
    public:
    B objB;

    void foo(){}
}

class B
{
    public:
    A objA;

    void foo(){}
}
PS:如果有人也可以解释为什么/为什么不能在逻辑上按类来解释,而不仅仅是语言方面,比如引用一些例子。这究竟是什么意味着课程?

4 个答案:

答案 0 :(得分:11)

第二个例子是不可能的。它表示为A分配的空间包含B的空间,后者又包含A的空间等。这将需要无限的内存,并且需要无限的时间来构建。

答案 1 :(得分:3)

不,无论是在语言方面还是在课堂方面都无法实现。

就类而言:每个实例包含一个B实例,其中包含一个实例,其中... =>无限递归。这不是指针版本的问题,因为指针可能不指向有效对象,或者所有A指针可能指向同一对象等。

答案 2 :(得分:0)

相互递归的类,例如你的第二个例子是不可能的。如果每个实例都有另一个类的相应实例,并且因为没有基本情况来停止递归,那么类的大小将是无限的。显然,实例化如此庞大的类很难。

答案 3 :(得分:-1)

3.9 / 5告诉:

  

已声明但未定义的类,或未知大小或不完整元素类型的数组,是一个未完全定义的对象类型.43不完全定义的对象类型和void类型是不完整类型(3.9.1 )。对象不得定义为不完整类型。

在你的第二个例子中,A类试图定义一个不完整类型的成员变量,因此形成不良。