';' がありません。

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

';' がありません。

#1

投稿記事 by shinpei » 12年前

Visual Studio 2012でこのように書いたことろ,

A.h

コード:

#pragma once
#include "B.h"

class A
{
public:
	B collision;
	A(void);
	~A(void);
};
A.cpp

コード:

#include "A.h"


A::A(void)
{
}


A::~A(void)
{
}
B.h

コード:

#pragma once
#include "A.h"
class B
{
public:
	A* mother;
	B(void);
	~B(void);
};
B.cpp

コード:

#include "B.h"


B::B(void)
{
}


B::~B(void)
{
}

shinpei

Re: ';' がありません。

#2

投稿記事 by shinpei » 12年前

すみません。途中で送信してしいました。続きです。

ビルドするとこのようなエラーが出ます。何故ですか?
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 スキップ ==========
よろしくお願いします。

アバター
パコネコ
記事: 139
登録日時: 14年前
住所: 大阪

Re: ';' がありません。

#3

投稿記事 by パコネコ » 12年前

こんばんわ。
実際いま試したわけではないのですが、おそらく2回読み込めないのが原因なのだと思います。
(ヘッダーファイルからヘッダー読んでるため  おもに #pragma once のせいかな?)

例えば

コード:

#pragma once
#include "B.h"
 
class A
{
public:
    B collision;
    A(void);
    ~A(void);
};
これは、

コード:

#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側では宣言無いことになる)

ちょっとわかりにくいですね。
キーワードとして「前方宣言」というものを使ってみてはいかがでしょうか?
使い方自体は簡単なので調べてみてください。
(私はヘッダーファイルでヘッダー呼ぶ際にはヘッダー呼ぶ前アタリに前方宣言を投げ込んでます。)



もし勘違いで関係ないこと描いてしまっていたらごめんなさい。
その場合だれか指摘しといてください><
ニャン!!\(゜ロ\)(/ロ゜)/

YuO
記事: 947
登録日時: 14年前
住所: 東京都世田谷区

Re: ';' がありません。

#4

投稿記事 by YuO » 12年前

今回の場合,
  • 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>のように,

コード:

class A;
とだけ書いたAfwd.hのようなファイルを用意し,B.hはA.hではなくAfwd.hをインクルードするようにすれば良いでしょう。

閉鎖

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