2012-01-12 124 views
4

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

回答

9

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

2

不,从语言或班级的角度来讲,这是不可能的。

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

0

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

-1

3.9/5告诉:

已经宣告但DE音响定义的类,或未知的大小或不完整的元素类型的阵列,是一种不完全德音响奈德对象type.43不完全德音响奈德对象类型和void类型是不完整的类型(3.9.1)。对象不应被定义为不完整的类型。

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