Синтаксические ошибки в 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 заголовок, который определяет тип.

Другие вопросы по тегам