• 締切済み

クラス構造をネストしたの宣言

クラスA クラスB を使い、お互いに関連した構造にしたいのですが、宣言に困り質問させていただきました。 A.cpp ファイルは class A{ B b; }; のように、クラスB を含んだ状態です。クラスBもクラスAを含んだ状態です。 ここで、オブジェクトファイルを作成すべく、 $g++ -c A.cpp とすると、クラスBが宣言されておらず怒られてしまいます。 クラスBを先に宣言したり、ヘッダーファイルを作成しても、クラスBでもクラスAのオブジェクトを使っているので、やはり"定義されていない"とおこられてしまします。 C言語の関数を入籠にした場合は、プロトタイプを使用して問題を回避しましたが、クラスの場合でこれを解決する手段がわからず質問させていただきました。 どうかご教授ください。

みんなの回答

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

#1 で触れられている ・クラス A の中にクラス B のメンバがある ・クラス B の中にクラス A のメンバがある という方法は当然ですが不可能. 少なくとも一方はポインタなり参照なりにする必要があります. まあ, 設計上いいかどうかはさておき.

  • noocyte
  • ベストアンサー率58% (171/291)
回答No.3

> クラスB を含んだ状態です。クラスBもクラスAを含んだ状態です C++ の言語仕様以前に,ご自分が何をしようとしているか理解されていますか? A,Bという2つの箱があり,Aの中にBが入っているとして, そのままの状態でAをBの中に入れることができるでしょうか? これはつまり,箱Aをそれ自身の中に入れようとすることになります. C++ を全然知らない人から見ても,絶対不可能なことは明らかです. 2つのクラスを相互に関連付けたいのなら,少なくとも一方をポインタにして, 例えば↓のようにすれば可能です. A.h ----------------------------------- #include "B.h" class A { B b; // または B *b; }; B.h ---------------------------------- class A; class B { A *a; }; --------------------------------------

  • MeeCat
  • ベストアンサー率75% (6/8)
回答No.2

クラス名を認識させるだけなら「前方宣言」について検索するといいでしょう。 他方のクラスのメンバー関数を呼んだりする場合は、ヘッダーをインクルードしなければなりませんので、ヘッダー内で「前方宣言」を使うことになるでしょう。 ついでに「二重インクルードの防止」について調べておくと、今後の役に立つと思います。 がんばって下さい。

  • galluda
  • ベストアンサー率35% (440/1242)
回答No.1

がると申します。 えと… ・Aクラスの中にBクラスが含まれている ・Bクラスの中にAクラスが含まれている で状況はあってますでしょうか? 言語仕様的に云々以前の問題として、設計に問題がありすぎるので。 「どうやって実装するか」ではなく、設計を見直されることを強くお勧めいたします。 回答、ではなくて大変に恐縮ですが。

関連するQ&A

専門家に質問してみよう