2010-06-17 3 views
0

Je développe un jeu. J'ai un en-tête GameSystem (juste des méthodes comme la boucle de jeu, pas de classe) avec deux variables:
int mouseX et int mouseY. Ceux-ci sont mis à jour dans ma boucle de jeu. Maintenant, je veux y accéder à partir du fichier Game.cpp (une classe construite par un fichier d'en-tête et le fichier source). Donc, je #include "GameSystem.h" en Game.h. Après cela, je reçois beaucoup d'erreurs de compilation. Quand je retire include dit-il bien sûr:C++: Peut-être connaissez-vous cet écueil?

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

Là où je veux accéder mouseX et mouseY.

Tous mes fichiers .h ont des gardes d'en-tête, générés par Eclipse.
J'utilise SDL et si je supprime les lignes qui veulent accéder aux variables, tout compile et fonctionne parfaitement (*).

J'espère que vous pouvez me aider ...

Ceci est l'erreur-log quand je #include "GameSystem.h" (Tout le code est-il à des œuvres référait, comme expliqué par le (*)):

 
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 

Ceci est le code qui tentent d'accéder aux deux variables:

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

Le code indiquant les déclarations pertinentes serait utile, en particulier les lignes spécifiées dans le message d'erreur. – Cogwheel

+2

Vous devez probablement afficher le code en question (GameSystem.h). Les erreurs que vous montrez * sonnent * comme quelque chose de fondamental, comme un point-virgule manquant, mais sans voir le code, c'est terriblement difficile à deviner. –

+0

En général, les en-têtes sont pour les déclarations qui seront partagées et les corps pour les définitions. L'inclusion de corps dans les en-têtes est généralement évitée car, en utilisant plusieurs fois les en-têtes, vous ne voulez pas que plusieurs définitions des mêmes variables/fonctions soient compilées. Inline et le modèle sont quelques-unes des exceptions. –

Répondre

4

Dans votre tête GameSystem, ne définissez pas ces variables comme:

int mouseX; 
int mouseY; 

à la place, vous devez les déclarer:

extern int mouseX; 
extern int mouseY; 

Puis, dans l'un de vos fichiers .cpp vous les définissez:

int mouseX; 
int mouseY; 

Le problème avec les définir dans un fichier d'en-tête est que le compilateur va essayer de les instancier dans chaque fichier .cpp où vous incluez l'en-tête.

+1

Oui, mais ce n'est pas la cause de toutes ces erreurs dans la question. – Troubadour

+0

En effet cela fonctionne. Merci beaucoup! Mais de cette façon, ils sont déclarés dans "l'un des fichiers .cpp". N'y at-il pas un moyen de les déclarer dans mon "GameSystem.h"? –

+0

Désolé, pas de manière standard. – Joshua