Синтаксические ошибки в C++ включаемом файле
Я пишу игру на C++ в Microsoft Visual Studio 2010, вчера я написал игру в понг, и все было хорошо, но теперь компилятор говорит мне, что, например, есть много ошибок:
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:...
};
Если когда я запускаю его, он не видит его, то почему он видит это при кодировании?
1 ответ
У вас есть циркуляр включает. Предположим, вы компилируете файл с #include "WorldMap.h"
в качестве первого применимого #include
заявление. Файл WorldMap.h
имеет это #include "Room.h"
это вызовет много проблем. Проблемы начинаются всерьез в Room.h
на #include "WorldMap.h"
заявление. Тот #include
не имеет никакого эффекта благодаря #pragma once
в WorldMap.h
, Когда компилятор доходит до точки обработки основной части Room.h
, класс WorldMap
не определен и не объявлен.
добавление
Решение состоит в том, чтобы избавиться от посторонних #include
заявления. Файл WorldMap.h
не нужно #include
любой из Room.h
или же Player.h
, Вместо этого он должен сделать предварительные объявления классов Room
а также Player
, Точно так же вам не нужны все эти #include
заявления в Room.h
или.
Как правило, в заголовках рекомендуется использовать предварительные объявления типов вместо того, чтобы включать файл, определяющий типы. Если коду в заголовке не нужно знать детали рассматриваемого типа, просто используйте предварительную декларацию. Не делайте #include
заголовок, который определяет тип.