我知道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);
}
答案 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.h
,Flight.h
和common.h
编辑:回应评论。
你需要例如来自#include "Landing.h"
的{{1}}以便实际使用该类。你不能在Event.cpp
答案 2 :(得分:3)
如果您在Flight
中转发声明Landing
和Event.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 Event
和class Arrival: public Event
类应该知道class Event: public Item
,但事件不应该知道class Landing: public Event
或class Arrival: public Event
。
我希望这对您有帮助,阿尔贝托
答案 4 :(得分:0)
我遇到相同的错误,但问题不同,
我在标题中使用了命名空间,却忘记了右括号,而得到了这个隐秘的错误。