2012-01-12 63 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試圖定義一個不完整類型的成員變量,因此它是一個病態。