Visual Studio 2012でこのように書いたことろ,
A.h
A.cpp
B.h
B.cpp
';' がありません。
Re: ';' がありません。
すみません。途中で送信してしいました。続きです。
ビルドするとこのようなエラーが出ます。何故ですか?
ビルドするとこのようなエラーが出ます。何故ですか?
1>------ ビルド開始: プロジェクト: includeTest, 構成: Debug Win32 ------ 1> A.cpp 1>c:\users\\documents\visual studio 2012\projects\includetest\includetest\b.h(6): error C2143: 構文エラー : ';' が '*' の前にありません。 1>c:\users\\documents\visual studio 2012\projects\includetest\includetest\b.h(6): error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません 1> B.cpp 1>c:\users\\documents\visual studio 2012\projects\includetest\includetest\a.h(7): error C2146: 構文エラー : ';' が、識別子 'collision' の前に必要です。 1>c:\users\\documents\visual studio 2012\projects\includetest\includetest\a.h(7): error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません 1> コードを生成中... ========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========よろしくお願いします。
Re: ';' がありません。
こんばんわ。
実際いま試したわけではないのですが、おそらく2回読み込めないのが原因なのだと思います。
(ヘッダーファイルからヘッダー読んでるため おもに #pragma once のせいかな?)
例えば これは、
こんなかんじに展開され、この先も無限に続きます。
ですが今回は
#pragma once
があるため無限ループにはなりません。
代わりにどっちかの宣言がないことになります。
(Aが2回呼び出せないためB側では宣言無いことになる)
ちょっとわかりにくいですね。
キーワードとして「前方宣言」というものを使ってみてはいかがでしょうか?
使い方自体は簡単なので調べてみてください。
(私はヘッダーファイルでヘッダー呼ぶ際にはヘッダー呼ぶ前アタリに前方宣言を投げ込んでます。)
もし勘違いで関係ないこと描いてしまっていたらごめんなさい。
その場合だれか指摘しといてください><
実際いま試したわけではないのですが、おそらく2回読み込めないのが原因なのだと思います。
(ヘッダーファイルからヘッダー読んでるため おもに #pragma once のせいかな?)
例えば これは、
#pragma once
//#include "B.h"<-これが展開
#pragma once
#include "A.h"
class B
{
public:
A* mother;
B(void);
~B(void);
};
class A
{
public:
B collision;
A(void);
~A(void);
};
ですが今回は
#pragma once
があるため無限ループにはなりません。
代わりにどっちかの宣言がないことになります。
(Aが2回呼び出せないためB側では宣言無いことになる)
ちょっとわかりにくいですね。
キーワードとして「前方宣言」というものを使ってみてはいかがでしょうか?
使い方自体は簡単なので調べてみてください。
(私はヘッダーファイルでヘッダー呼ぶ際にはヘッダー呼ぶ前アタリに前方宣言を投げ込んでます。)
もし勘違いで関係ないこと描いてしまっていたらごめんなさい。
その場合だれか指摘しといてください><
ニャン!!\(゜ロ\)(/ロ゜)/
Re: ';' がありません。
今回の場合,
後者はB.hがA.hをインクルードすると,class A内でclass Bの定義が必要になるのに,その時点で未定義となるためです。
どうしてもB.h内でclass Aの宣言をしたくないのであれば,<iosfwd>のように, とだけ書いたAfwd.hのようなファイルを用意し,B.hはA.hではなくAfwd.hをインクルードするようにすれば良いでしょう。
- class Aの定義にclass Bの定義が必要→A.hはclass Bの定義が記述してあるB.hをインクルードする必要がある
- class Bの定義にclass Aの定義は不要→B.h内にclass A;と書く
後者はB.hがA.hをインクルードすると,class A内でclass Bの定義が必要になるのに,その時点で未定義となるためです。
どうしてもB.h内でclass Aの宣言をしたくないのであれば,<iosfwd>のように, とだけ書いたAfwd.hのようなファイルを用意し,B.hはA.hではなくAfwd.hをインクルードするようにすれば良いでしょう。