web-dev-qa-db-ja.com

エラー:「{」トークンの前にクラス名が必要です

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);
}
41
draw

交換

#include "Landing.h"

class Landing;

それでもエラーが発生する場合は、Item.hFlight.hcommon.hも投稿してください

編集:コメントへの応答。

あなたがする必要があります#include "Landing.h" from Event.cpp from実際にクラスを使用するため。 Event.hから含めることはできません

25
Erik

これはコメントである必要がありますが、コメントでは複数行コードを使用できません。

ここで何が起こっているのですか:

_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 EventEventについてはまだ聞いていません」と言います。

80
Ben Voigt

Event.hFlightLandingを前方宣言すると、修正されるはずです。

Eventの実装ファイルで#include "Flight.h"#include "Landing.h"を忘れないでください。

一般的な経験則は、それから派生するか、構成するか、値で使用する場合、コンパイラは宣言時に完全な定義を知っている必要があります。あなたがポインタへのポインタから作成する場合、コンパイラはポインタの大きさを知っています。同様に、参照を渡すと、コンパイラは参照の大きさも認識します。

3