【问题标题】: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 类尝试定义类型不完整的成员变量,因此它的格式不正确。