2011-08-20 183 views
1

我在微軟的Visual Studio 2010中用C++編寫遊戲,昨天我寫了一個pong遊戲,一切都很好,但現在編譯器告訴我有很多錯誤例如:C++中的語法錯誤包括文件

1>w:\c++\planet escape\planet escape\room.h(25): error C2061: syntax error : identifier 'WorldMap' 

這裏是Room.h文件:

#pragma once 

#include <allegro5/allegro.h> 
#include <vector> 
#include "Entity.h" 
#include "WorldMap.h" 
#include "Link.h" 

#define ROOM_W 20 
#define ROOM_H 20 

class Room{ 
private:... 
public:... 
}; 

當在代碼中沒有錯誤,它看到的所有類的罰款。 那麼會導致這樣的錯誤呢?

編輯: 這裏是WorldMap.h

#pragma once 

#include <allegro5/allegro.h> 
#include "Room.h" 
#include "Player.h" 

#define WORLD_W 10 
#define WORLD_H 10 

class WorldMap{ 
private:... 
public:... 
}; 

如果當我乳寧它他不能看出來他爲什麼看到它的編碼是什麼時候?

+3

你確定'WorldMap.h'定義了'WorldMap'類型嗎?編譯器告訴你它不能識別'WorldMap'類型。 –

+0

我想我們需要查看WorldMap.h文件來回答這個問題。 – Pete855217

+0

既然你只使用'WorldMap *',你實際上並不需要全部定義 - 你可以在'class Room {..};'聲明之前添加一個'class WorldMap'。儘管如此,在你真正使用它之前,你需要完整的課程。 – Rup

回答

5

你有通告包括。假設您正在編譯一個#include "WorldMap.h"作爲第一個適用的#include語句的文件。 WorldMap.h這個文件有#include "Room.h"這會造成很大的麻煩。 Room.h#include "WorldMap.h"聲明開始認真問題。由於WorldMap.h中的#pragma once#include不起作用。當編譯器到達處理Room.h主體的時候,類WorldMap既沒有定義也沒有聲明。

附錄
解決的辦法是擺脫那些多餘的#include語句。文件WorldMap.h不需要#include或者Room.hPlayer.h。它需要提前聲明類別RoomPlayer。同樣,您也不需要Room.h中的所有#include語句。

在你的頭文件中使用類型的前向聲明通常是一個好主意,而不是包含定義類型的文件。如果標題中的代碼不需要知道相關類型的細節,只需使用前向聲明即可。不要#include定義類型的標題。