2011-12-21 10 views
2

私はクラスAとクラスBのそれぞれに他のクラスのメンバがあるC++を持っています。これをどうすれば解決できますか?あなたはポインタと前方宣言を使用オブジェクトAはBのメンバーであり、オブジェクトBはAのメンバです

class A { 
    B memberY; 
} 


class B { 
    A memberX; 
} 
+0

OOAおよびDが不十分であることを除いて、クラスがこのように相互依存する場合、通常、依存関係を実装するヘルパークラスが存在することを意味します。例:チームにメンバーが含まれ、メンバーにチームが含まれている - >ヘルパークラスは、チームとメンバーの両方によって使用されるteam_memberになることができます。 – slashmais

答えて

6

//A.h 

class B; //forward declaration to class B 

class A { 
    B* memeberY; 
} 

header for class B: 

//B.h 

class A; //forward declaration to class B 

class B { 
    A* memeberX; 
} 

インスタンスは、クラスの完全な定義を知っているコンパイラを必要とするので、あなたは、ポインタのみで、オブジェクトインスタンスでこれを行うことはできません。

メモリ管理がクラスに割り当てられている場合は、デストラクタのメモリを解放する必要があることに注意してください。つまり、クラス内のcopy constructoroperator =も上書きする必要があります。

一方のクラスにもう一方のクラスのオブジェクトが含まれていても、他のクラスのヘッダーをヘッダーに含める必要があります。もう1つは前方宣言で解決しなければならないだろう。

+0

downvoteにコメントしましたか? –

+0

(d投票:元に戻す - 私はあまりにも速く読んで、遅すぎると思う)私のアプローチ(OO)の質問に私のコメントを参照してください。 – slashmais

3

ご希望の場合はお受けできません。これらのクラスの1つは、他のクラスへのポインタでなければなりません。実際のオブジェクトの再帰的関係を持つことはできません。オブジェクトのサイズは無限になります。

ですから、おそらくこのようなものが必要です。今

struct B; 
struct A 
{ 
    B * myB; 
}; 
struct B 
{ 
    A * myA; 
}; 

を両者がお互いへの参照を必要とするので、構造が問題となります。それで、私はあなたがこれらのオブジェクトをどのように構築するのか分からないので、コンストラクタを提供することができません。

これらのオブジェクトの1つが他のものを所有している可能性があるため、クリーンアップの問題も発生するようになりました。これはunique_ptrの使用を除きます。私はsmart_ptrを使用していましたが、循環参照を破るいくつかの機能を持たない限り、メモリリンクはまだあります。

しかし、なぜこれをやりたいのかを示す方が良いのであれば、より適切な回答を与えることができます。

関連する問題