错误:'{'标记之前的预期类名

时间:2011-03-16 01:08:06

标签: c++ g++

我知道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_ */

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_ */

更新:

我包含了Landing.h,因为Landing的构造函数在Event :: createNewLanding方法中被调用:

Landing* Event::createNewLanding(Arrival* arrival) {
    return new Landing(flight, time + Landing::PERMISSION_TIME);
}

5 个答案:

答案 0 :(得分:80)

这应该是注释,但注释不允许使用多行代码。

以下是发生的事情:

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是Event?我还没有听说过Event。”

答案 1 :(得分:24)

替换

#include "Landing.h"

class Landing;

如果仍然出现错误,请发布Item.hFlight.hcommon.h

编辑:回应评论。

你需要例如来自#include "Landing.h"的{​​{1}}以便实际使用该类。你不能在Event.cpp

中加入它

答案 2 :(得分:3)

如果您在Flight中转发声明LandingEvent.h,那么您应该得到修复。

请记住#include "Flight.h"的实施文件中的#include "Landing.h"Event

一般的经验法则是:如果您从中派生,或从中撰写,或按值使用它,编译器必须在声明时知道其完整定义。如果从指向它的指针编写,编译器将知道指针有多大。类似地,如果您传递对它的引用,编译器也会知道引用的大小。

答案 3 :(得分:2)

我知道回答这个问题有点晚了,但这是google中的第一条条目,所以我认为值得回答。

问题不是编码问题,是体系结构问题。

您已创建接口class Event: public Item来定义所有事件应实现的方法。然后,您定义了两种类型的事件,它们从class Event: public Item继承;到达和着陆,然后,您在Landing* createNewLanding(Arrival* arrival);界面中的着陆功能中添加了方法class Event: public Item。您应该将此方法移至class Landing: public Event类,因为它仅具有着陆的意义。 class Landing: public Eventclass Arrival: public Event类应该知道class Event: public Item,但事件不应该知道class Landing: public Eventclass Arrival: public Event

我希望这对您有帮助,阿尔贝托

答案 4 :(得分:0)

我遇到相同的错误,但问题不同,

我在标题中使用了命名空间,却忘记了右括号,而得到了这个隐秘的错误。