2012-01-12 8 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

2番目の例は不可能です。 Aに割り当てられたスペースにはBのスペースが含まれており、Aなどのスペースが含まれています。これには無限のメモリが必要で、構築に無限の時間がかかります。

2

いいえ、言語面でもクラス面でも不可能です。

クラスに関して:すべてのAインスタンスには、A =>無限再帰というインスタンスを含むBインスタンスが含まれています。ポインタが有効なオブジェクトを指していないか、またはすべてのAポインタが同じオブジェクトを指している可能性があるため、これはポインタバージョンの問題ではありません。

0

2番目の例のような相互再帰的なクラスは不可能です。各インスタンスに他のクラスの対応するインスタンスがあり、再帰を停止する基本ケースがないので、クラスのサイズは無限になります。明らかに、このような大きなクラスをインスタンス化するのは難しいでしょう。

-1

3.9/5指示:

デNED Fiの、または未知のサイズのまたは不完全な要素型の配列を宣言されなくされたクラスは、不完全に脱Fiあり定義さtype.43不完全ドFiが定義さオブジェクトであるオブジェクトvoid型は不完全型(3.9.1)です。オブジェクトは、不完全な型を持つと定義されてはならない。

2番目の例では、クラスAは不完全な型のメンバー変数を定義しようとします。

関連する問題