【问题标题】:Are mutually recursive classes possible?相互递归的类可能吗?
【发布时间】:2012-02-08 20:26:47
【问题描述】:

我使用前向声明阅读了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:如果有人也可以请解释为什么/为什么不从逻辑上讲这是可能的,而不是仅仅在语言方面,比如引用一些例子。就类而言,这究竟意味着什么?

【问题讨论】:

    标签: c++ class recursion declaration definition


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      不,无论是就语言而言,还是就课程而言,都不可能。

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

          3.9/5 告诉:

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

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

          【讨论】:

            猜你喜欢
            • 2011-03-25
            • 1970-01-01
            • 2015-06-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-12-13
            • 1970-01-01
            相关资源
            最近更新 更多