クラスの相互参照

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
nayo

クラスの相互参照

#1

投稿記事 by nayo » 16年前

現在C++でクラスの練習にゲームを作っているのですがつまづいてしまいました
というのも

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

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

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

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

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

lbfuvab

Re:クラスの相互参照

#2

投稿記事 by lbfuvab » 16年前

インクルードガード
#pragma once
等で調べると幸せになれると思いますよ。

たかぎ

Re:クラスの相互参照

#3

投稿記事 by たかぎ » 16年前

インクルードガードのほかに、先行宣言とか不完全型についても調べる必要があります。

dic

Re:クラスの相互参照

#4

投稿記事 by dic » 16年前

マクロで何重にもインクルードされない方法もあります
// ---
// a.h
#ifndef A_H_
#define A_H_
ここにクラスを宣言
#endif

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

バグ

Re:クラスの相互参照

#5

投稿記事 by バグ » 16年前

たしか、クラスのプロトタイプ宣言みたいなのができるんじゃなかったでしたっけ?

class B;

class A
{

};

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

nayo

Re:クラスの相互参照

#6

投稿記事 by nayo » 16年前

皆様ありがとうございます

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

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

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

nayo

Re:クラスの相互参照

#7

投稿記事 by nayo » 16年前

もう一度見直しているうちにAのクラスは別にBのクラスを参照する必要性はないと分かりました
そこでBクラスにAの特定関数をフレンドで宣言したところ無事自分の行いたいことができました

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

閉鎖

“C言語何でも質問掲示板” へ戻る