2011-03-16 54 views
30

我知道有幾個類似的問題(通告包括)出棧計算器和其他網站。但我仍然無法弄清楚,沒有解決方案。所以我想發佈我的具體內容。錯誤:在'{'令牌之前預期的類名

我有一個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_ */ 

UPDATE:

我公司luded Landing.h由於着陸的構造函數被調用的事件:: createNewLanding方法:

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

根據編譯器輸出,你的錯誤在'Landing.h'中(在第13行)。爲什麼你在'Event.h'中發表評論說錯誤在那裏? – 2011-03-16 01:13:43

+0

@Ben Voigt對不起,我改變了它 – draw 2011-03-16 01:21:22

回答

21

更換

#include "Landing.h" 

class Landing; 

如果仍然出現錯誤,也張貼Item.hFlight.hcommon.h

編輯:迴應評論。

您將需要#include "Landing.h"Event.cpp爲了實際使用這個類。你不能從Event.h

+0

,因爲我叫Landing的構造函數:Landing * Event :: createNewLanding(Arrival * arrival){return new Landing(flight,time + Landing :: PERMISSION_TIME); # – draw 2011-03-16 01:22:04

+3

'#include'需要的頭文件*在你的.cpp *中,而不是你的.h – Erik 2011-03-16 01:23:07

+0

。非常感謝。另一個問題:這是否意味着總是在你的頭文件中做前言引用是一個好習慣? – draw 2011-03-16 01:30:58

2

包括在Event.h如果向前聲明FlightLanding,那麼你就應該是固定的。

請記住在您的實施文件中的#include "Flight.h"#include "Landing.h"Event

一般的經驗法則是:如果你從它派生出來,或者由它構成,或者按值使用它,編譯器在聲明時必須知道它的完整定義。如果你從一個指針指向它,編譯器會知道指針有多大。同樣,如果你傳遞一個引用,編譯器也會知道引用的大小。

+1

'#include '通常是不正確的 - 使用'「privateheader.h」' – Erik 2011-03-16 01:14:38

74

這應該是一個評論,但評論不允許多行代碼。

這裏發生的事情:

Event.cpp

#include "Event.h" 

預處理開始Event.h

#ifndef EVENT_H_ 

它尚未定義的處理,所以堅持下去

#define EVENT_H_ 
#include "common.h" 

common.h得到處理確定

#include "Item.h" 

Item.h得到處理確定

#include "Landing.h" 

預處理器開始處理

#include "Flight.h" 

Flight.h得到處理確定Landing.h

#ifndef LANDING_H_ 

沒有定義呢,繼續前進

#define LANDING_H_ 

#include "Event.h" 

預處理器開始處理Event.h

#ifndef EVENT_H_ 

這是已定義的,文件的整個其餘都不會被跳過。與Landing.h

class Landing: public Event { 

預處理繼續不關心這個,但是編譯器去「WTH是Event?我沒有聽說過Event呢。」

+0

@Ben如果我們使用'class Landing'而不是'#include ',將定義'Landing'兩次?如果預處理器不跳過'#ifndef LANDING_H_',它如何對待'class Landing'?按照定義或不? – 2015-11-05 21:12:27

+1

@MiloLu:這就是爲什麼你使用前向聲明'class Landing;'這不是一個定義('{}'中沒有主體)。 – 2015-11-06 15:11:58

相關問題