C++: Может быть, вы знаете эту ловушку?

Я разрабатываю игру. У меня есть заголовок GameSystem (просто методы, такие как игровой цикл, без класса) с двумя переменными:
int mouseX и int mouseY. Они обновляются в моем игровом цикле. Теперь я хочу получить к ним доступ из файла Game.cpp (класс, созданный файлом заголовка и исходным файлом). Итак, я #include "GameSystem.h" в Game.h. После этого я получаю много ошибок компиляции. Когда я удаляю включение, он, конечно, говорит:

Game.cpp:33: error: ‘mouseX’ was not declared in this scope
Game.cpp:34: error: ‘mouseY’ was not declared in this scope

Где я хочу получить доступ к mouseX и mouseY.

Все мои файлы .h имеют защиту заголовков, сгенерированную Eclipse.
Я использую SDL, и если я удаляю строки, которые хотят получить доступ к переменным, все компилируется и работает отлично (*).

Я надеюсь, что вы можете помочь мне...

Это журнал ошибок, когда я #include "GameSystem.h" (весь код, на который он ссылается, работает, как показано в (*)):

In file included from ../trunk/source/domein/Game.h:14,
                 from ../trunk/source/domein/Game.cpp:8:
../trunk/source/domein/GameSystem.h:30: error: expected constructor, destructor, or type conversion before ‘*’ token
../trunk/source/domein/GameSystem.h:46: error: variable or field ‘InitGame’ declared void
../trunk/source/domein/GameSystem.h:46: error: ‘Game’ was not declared in this scope
../trunk/source/domein/GameSystem.h:46: error: ‘g’ was not declared in this scope
../trunk/source/domein/GameSystem.h:46: error: expected primary-expression before ‘char’
../trunk/source/domein/GameSystem.h:46: error: expected primary-expression before ‘bool’
../trunk/source/domein/FPS.h:46: warning: ‘void FPS_SleepMilliseconds(int)’ defined but not used

Это код, который пытается получить доступ к двум переменным:

SDL_Rect pointer;
pointer.x = mouseX;
pointer.y = mouseY;
pointer.w = 3;
pointer.h = 3;
SDL_FillRect(buffer, &pointer, 0xFF0000);

person Martijn Courteaux    schedule 17.06.2010    source источник
comment
Код, показывающий соответствующие объявления, был бы полезен, особенно строки, указанные в сообщении об ошибке.   -  person Cogwheel    schedule 17.06.2010
comment
Вероятно, вам нужно показать рассматриваемый код (GameSystem.h). Ошибки, которые вы показываете, звучат как что-то фундаментальное, например, пропущенная точка с запятой, но, не видя кода, очень трудно догадаться.   -  person Jerry Coffin    schedule 17.06.2010
comment
вообще говоря, заголовки предназначены для объявлений, которые будут использоваться совместно, а тела — для определений. Включение тел в заголовки в основном избегается, так как при многократном использовании заголовков вы не хотите компилировать несколько определений одних и тех же переменных/функций. Встроенные и шаблонные являются некоторыми исключениями.   -  person Greg Domjan    schedule 17.06.2010


Ответы (1)


В заголовке GameSystem не определяйте эти переменные как:

int mouseX;
int mouseY;

вместо этого вы должны объявить их:

extern int mouseX;
extern int mouseY;

Затем в одном из ваших файлов .cpp вы определяете их:

int mouseX;
int mouseY;

Проблема с их определением в заголовочном файле заключается в том, что компилятор попытается создать их экземпляры в каждом отдельном .cpp, куда вы включаете заголовок.

person Amardeep AC9MF    schedule 17.06.2010
comment
Да, но это не причина всех этих ошибок в вопросе. - person Troubadour; 17.06.2010
comment
Действительно это работает. Большое спасибо! Но таким образом они объявляются в одном из файлов .cpp. Разве нет способа объявить их в моем GameSystem.h? - person Martijn Courteaux; 17.06.2010
comment
@Troubadour: Эти ошибки произошли из-за того, что он перестал включать заголовочный файл, чтобы избежать исходной ошибки множественного определения. Это подразумевалось, но не отображалось в вопросе, поэтому это немного сбивает с толку. - person Amardeep AC9MF; 17.06.2010
comment
@Amardeep: А, хорошо. Тогда я полностью сбит с толку вопросом, потому что он ясно говорит, что это ошибки, когда заголовок включается. Молодец, что проработал! +1. - person Troubadour; 17.06.2010
comment
Спасибо; Есть ли у этого явления название? Где я могу узнать об этом? - person Martijn Courteaux; 17.06.2010
comment
Да, я нашел это (чтобы объявить это в GameSystem): просто поменяйте местами extern ключевые слова. - person Martijn Courteaux; 17.06.2010