Синтаксические ошибки в C ++ включаемом файле - PullRequest
1 голос
/ 20 августа 2011

Я пишу игру на 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:...
};

Когда в коде нет ошибок, он видит все классы нормально. Так что может вызвать такую ​​ошибку?

EDIT: вот карта мира.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 Ответ

5 голосов
/ 20 августа 2011

У вас есть циркуляр включает. Предположим, вы компилируете файл с #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 заголовок, который определяет тип.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...