ページ 11

クラスの相互参照

Posted: 2008年12月22日(月) 03:12
by nayo
現在C++でクラスの練習にゲームを作っているのですがつまづいてしまいました
というのも

クラスAがクラスBのメンバを参照したい
クラスBがクラスAのメンバを参照したい

という状況なのですが試しに両方のヘッダにお互い相手側のヘッダをインクルードしたところ
無限にインクルードし続けたのかインクルードファイルが多すぎますと怒られてしまいました

相互参照、循環参照というらしいのですが
色々調べてもはっきりとした答えが得られず悩んでいるところです

年末の忙しい時期ですがどなたかご回答お願いします

開発環境は Visual C++ 2008 Express Edition です

Re:クラスの相互参照

Posted: 2008年12月22日(月) 03:17
by lbfuvab
インクルードガード
#pragma once
等で調べると幸せになれると思いますよ。

Re:クラスの相互参照

Posted: 2008年12月22日(月) 07:05
by たかぎ
インクルードガードのほかに、先行宣言とか不完全型についても調べる必要があります。

Re:クラスの相互参照

Posted: 2008年12月22日(月) 07:19
by dic
マクロで何重にもインクルードされない方法もあります
// ---
// a.h
#ifndef A_H_
#define A_H_
ここにクラスを宣言
#endif

//----
// b.h
#ifndef B_H_
#define B_H_
ここにクラスを宣言
#endif

Re:クラスの相互参照

Posted: 2008年12月22日(月) 08:36
by バグ
たしか、クラスのプロトタイプ宣言みたいなのができるんじゃなかったでしたっけ?

class B;

class A
{

};

こんな感じでいけたような気がするんだけど…?

Re:クラスの相互参照

Posted: 2008年12月22日(月) 19:32
by nayo
皆様ありがとうございます

元々dicさんの方法で作っていたのですが
#include "○○"
を#ifndefの外側に記述していたために無限にインクルードされていたようです
こちらは内側に記述する事で解決しました

そこで問題の部分を解決すべく先行宣言や不完全型を調べてみたのですが
バグさんの紹介してくれたようなものが載っていました
しかし色々と制限があるらしく実際にclass A{};の前にclass B;と記述したところ
>静的でないメンバ関数の呼び出しが正しくありません
といったエラーが出てしまいました

まだクラスについて初心者なのでそもそもこのような相互参照するようなクラス設計に問題がありそうです
もう少し設計を考えてみます

Re:クラスの相互参照

Posted: 2008年12月22日(月) 23:24
by nayo
もう一度見直しているうちにAのクラスは別にBのクラスを参照する必要性はないと分かりました
そこでBクラスにAの特定関数をフレンドで宣言したところ無事自分の行いたいことができました

まだ色々と不慣れなので少しずつオブジェクト指向プログラミングの考え方に慣れていこうと思います