現在C++でクラスの練習にゲームを作っているのですがつまづいてしまいました
というのも
クラスAがクラスBのメンバを参照したい
クラスBがクラスAのメンバを参照したい
という状況なのですが試しに両方のヘッダにお互い相手側のヘッダをインクルードしたところ
無限にインクルードし続けたのかインクルードファイルが多すぎますと怒られてしまいました
相互参照、循環参照というらしいのですが
色々調べてもはっきりとした答えが得られず悩んでいるところです
年末の忙しい時期ですがどなたかご回答お願いします
開発環境は Visual C++ 2008 Express Edition です
クラスの相互参照
Re:クラスの相互参照
マクロで何重にもインクルードされない方法もあります
// ---
// a.h
#ifndef A_H_
#define A_H_
ここにクラスを宣言
#endif
//----
// b.h
#ifndef B_H_
#define B_H_
ここにクラスを宣言
#endif
// ---
// a.h
#ifndef A_H_
#define A_H_
ここにクラスを宣言
#endif
//----
// b.h
#ifndef B_H_
#define B_H_
ここにクラスを宣言
#endif
Re:クラスの相互参照
たしか、クラスのプロトタイプ宣言みたいなのができるんじゃなかったでしたっけ?
class B;
class A
{
};
こんな感じでいけたような気がするんだけど…?
class B;
class A
{
};
こんな感じでいけたような気がするんだけど…?
Re:クラスの相互参照
皆様ありがとうございます
元々dicさんの方法で作っていたのですが
#include "○○"
を#ifndefの外側に記述していたために無限にインクルードされていたようです
こちらは内側に記述する事で解決しました
そこで問題の部分を解決すべく先行宣言や不完全型を調べてみたのですが
バグさんの紹介してくれたようなものが載っていました
しかし色々と制限があるらしく実際にclass A{};の前にclass B;と記述したところ
>静的でないメンバ関数の呼び出しが正しくありません
といったエラーが出てしまいました
まだクラスについて初心者なのでそもそもこのような相互参照するようなクラス設計に問題がありそうです
もう少し設計を考えてみます
元々dicさんの方法で作っていたのですが
#include "○○"
を#ifndefの外側に記述していたために無限にインクルードされていたようです
こちらは内側に記述する事で解決しました
そこで問題の部分を解決すべく先行宣言や不完全型を調べてみたのですが
バグさんの紹介してくれたようなものが載っていました
しかし色々と制限があるらしく実際にclass A{};の前にclass B;と記述したところ
>静的でないメンバ関数の呼び出しが正しくありません
といったエラーが出てしまいました
まだクラスについて初心者なのでそもそもこのような相互参照するようなクラス設計に問題がありそうです
もう少し設計を考えてみます
Re:クラスの相互参照
もう一度見直しているうちにAのクラスは別にBのクラスを参照する必要性はないと分かりました
そこでBクラスにAの特定関数をフレンドで宣言したところ無事自分の行いたいことができました
まだ色々と不慣れなので少しずつオブジェクト指向プログラミングの考え方に慣れていこうと思います
そこでBクラスにAの特定関数をフレンドで宣言したところ無事自分の行いたいことができました
まだ色々と不慣れなので少しずつオブジェクト指向プログラミングの考え方に慣れていこうと思います