2011-08-20 2 views
1

저는 어제 Visual Studio 2010에서 C++로 게임을 작성했습니다. 어제 나는 탁구 게임을 작성했는데 모든게 괜찮 았지만 이제는 컴파일러에서 오류가 많이 있음을 말하고 있습니다 :C++의 구문 오류는 파일을 포함합니다

코드에서

#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:... 
}; 

실수가없는 그것은 잘 모든 클래스를 본다 : 여기

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

그리고 는 Room.h 파일입니다. 그런 실수를 일으킬 수있는 것은 무엇입니까?

편집 : 여기가 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 WorldMap;'을 추가하면됩니다. 실제로 사용하기 전에 전체 수업이 필요합니다. – Rup

답변

5

원형 포함입니다. 첫 번째 적용 가능한 #include 문으로 #include "WorldMap.h"을 갖는 파일을 컴파일한다고 가정합니다. WorldMap.h 파일에는 많은 문제를 일으킬 수있는 #include "Room.h"이 있습니다. 문제는 Room.h에서 #include "WorldMap.h" 진술에 본격적으로 시작됩니다. 그 #include#pragma onceWorldMap.h에 덕분에 효과가 없습니다. 컴파일러가 본체 Room.h을 처리하는 시점에 도달하면 클래스 WorldMap이 정의되거나 선언되지 않습니다.

부록
이 솔루션은 그 외부 #include 문을 제거하는 것입니다. 파일 WorldMap.h#includeRoom.h 또는 Player.h 일 필요가 없습니다. 대신 클래스 RoomPlayer의 선언을 만들어야합니다. 마찬가지로 #include 문도 모두 Room.h에 필요하지 않습니다.

일반적으로 유형을 정의하는 파일을 포함하는 대신 헤더에 유형의 전달 선언을 사용하는 것이 좋습니다. 헤더에있는 코드가 문제의 유형에 대한 세부 정보를 알 필요가없는 경우 전달 선언 만 사용하면됩니다. 유형을 정의하는 헤더 인 #include을 사용하지 마십시오.

관련 문제