StackOverflowや他のWebサイトには、同様の質問(循環インクルード)がいくつかあることを知っています。しかし、私はまだそれを理解できず、解決策は現れません。だから私は私の特定のものを投稿したいと思います。
イベントクラスには2つのサブクラスがあり、実際にはサブクラスは到着と着陸です。コンパイラー(g ++)からの不満:
g++ -c -Wall -g -DDEBUG Event.cpp -o Event.o
In file included from Event.h:15,
from Event.cpp:8:
Landing.h:13: error: expected class-name before ‘{’ token
make: *** [Event.o] Error 1
人々は、それが循環インクルードだと言いました。 3つのヘッダーファイル(Event.h Arrival.h Landing.h)は次のとおりです。
event.h:
#ifndef EVENT_H_
#define EVENT_H_
#include "common.h"
#include "Item.h"
#include "Flight.h"
#include "Landing.h"
class Arrival;
class Event : public Item {
public:
Event(Flight* flight, int time);
virtual ~Event();
virtual void occur() = 0;
virtual string extraInfo() = 0; // extra info for each concrete event
// @implement
int compareTo(Comparable* b);
void print();
protected:
/************** this is why I wanna include Landing.h *******************/
Landing* createNewLanding(Arrival* arrival); // return a Landing obj based on arrival's info
private:
Flight* flight;
int time; // when this event occurs
};
#endif /* EVENT_H_ */
Arrival.h:
#ifndef ARRIVAL_H_
#define ARRIVAL_H_
#include "Event.h"
class Arrival: public Event {
public:
Arrival(Flight* flight, int time);
virtual ~Arrival();
void occur();
string extraInfo();
};
#endif /* ARRIVAL_H_ */
Landing.h
#ifndef LANDING_H_
#define LANDING_H_
#include "Event.h"
class Landing: public Event {/************** g++ complains here ****************/
public:
static const int PERMISSION_TIME;
Landing(Flight* flight, int time);
virtual ~Landing();
void occur();
string extraInfo();
};
#endif /* LANDING_H_ */
更新:
ランディングのコンストラクターはEvent :: createNewLandingメソッドで呼び出されるため、Landing.hを含めました。
Landing* Event::createNewLanding(Arrival* arrival) {
return new Landing(flight, time + Landing::PERMISSION_TIME);
}
交換
#include "Landing.h"
と
class Landing;
それでもエラーが発生する場合は、Item.h
、Flight.h
、common.h
も投稿してください
編集:コメントへの応答。
あなたがする必要があります#include "Landing.h"
from Event.cpp
from実際にクラスを使用するため。 Event.h
から含めることはできません
これはコメントである必要がありますが、コメントでは複数行コードを使用できません。
ここで何が起こっているのですか:
_Event.cpp
_
_#include "Event.h"
_
プリプロセッサは_Event.h
_の処理を開始します
_#ifndef EVENT_H_
_
まだ定義されていないので、続けてください
_#define EVENT_H_
#include "common.h"
_
_common.h
_は正常に処理されます
_#include "Item.h"
_
_Item.h
_は正常に処理されます
_#include "Flight.h"
_
_Flight.h
_は正常に処理されます
_#include "Landing.h"
_
プリプロセッサは_Landing.h
_の処理を開始します
_#ifndef LANDING_H_
_
まだ定義されていません、続けてください
_#define LANDING_H_
#include "Event.h"
_
プリプロセッサは_Event.h
_の処理を開始します
_#ifndef EVENT_H_
_
このISは既に定義されているため、ファイルの残りの部分全体がスキップされます。_Landing.h
_
_class Landing: public Event {
_
プリプロセッサはこれを気にしませんが、コンパイラは「WTH is Event
?Event
についてはまだ聞いていません」と言います。
Event.h
のFlight
とLanding
を前方宣言すると、修正されるはずです。
Event
の実装ファイルで#include "Flight.h"
と#include "Landing.h"
を忘れないでください。
一般的な経験則は、それから派生するか、構成するか、値で使用する場合、コンパイラは宣言時に完全な定義を知っている必要があります。あなたがポインタへのポインタから作成する場合、コンパイラはポインタの大きさを知っています。同様に、参照を渡すと、コンパイラは参照の大きさも認識します。