我知道有两个类似的问题(循环包括)stackoverflow和其他网站。但是我仍然无法弄清楚,也没有解决的办法。因此,我想发表我的具体观点。

我有一个Event类,其中有2个,实际上还有更多的子类,即Arrival和Landing。编译器(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_ */

到达时间:
#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_ */

登陆
#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的构造函数,因此包含了Landing.h:
Landing* Event::createNewLanding(Arrival* arrival) {
    return new Landing(flight, time + Landing::PERMISSION_TIME);
}

最佳答案

更换

#include "Landing.h"


class Landing;

如果仍然出现错误,请同时发布Item.hFlight.hcommon.h
编辑:回应评论。

您将需要例如#include "Landing.h"中的Event.cpp,以便实际使用该类。您只是无法从Event.h包含它

08-16 10:04