是否可以相互递归类

Are mutually recursive classes possible?

本文关键字:递归 是否      更新时间:2023-10-16

我读到了如何使用前向声明来使其工作。

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:如果有人也可以解释为什么/为什么不这样做在逻辑上从类方面实现,而不仅仅是在语言方面,例如引用一些例子。就类而言,这究竟意味着什么?

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

不,无论是在语言方面还是在类方面都是不可能的。

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

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

3.9/5 告诉:

已声明但未定义的类,或者大小未知或元素类型不完整的数组,是未完全定义的对象类型。43 未完全定义的对象类型和 void 类型是不完整的类型 (3.9.1(。对象不应定义为具有不完整的类型。

在第二个示例中,类 A 尝试定义一个类型不完整的成员变量,因此它是格式错误的。