2016-12-08 1 views
0

Je sais que cela a été demandé un certain nombre de fois, mais aucune réponse ne semble résoudre ce problème.C++ Inclure les gardes

J'ai deux fichiers.

Main.cpp

#include <irrlicht\irrlicht.h> 

#include <vector> 
#include <string> 
#include <iostream> 

#include "Scene.h" 
#include "Camera.h" 
#include "Gui.h" 

irr::IrrlichtDevice* device; 
irr::video::IVideoDriver* driver; 

int main() { 
device = irr::createDevice(irr::video::EDT_SOFTWARE, irr::core::dimension2d<irr::u32>(640, 480), 16, false, false, false, 0); 

if (!device) 
    return 1; 

device->setWindowCaption(L"NeoTrap"); 
driver = device->getVideoDriver(); 
sceneManager = device->getSceneManager(); 
GUIEnvironment = device->getGUIEnvironment(); 

//Testing 
Mesh* ground = new Mesh(); 
//Testing 

while (device->run()) { 
    driver->beginScene(true, true, irr::video::SColor(255, 120, 102, 136)); 

    sceneManager->drawAll(); 
    GUIEnvironment->drawAll(); 

    driver->endScene(); 
} 

device->drop(); 
return 0; 
} 

Scene.h

#ifndef _SCENE_HEADER_ 
#define _SCENE_HEADER_ 

irr::scene::ISceneManager* sceneManager; 

struct Mesh { 
public: 
Mesh(); 

private: 
}; 

class Scene { 
public: 
Scene(); 

private: 

}; 

#endif 

Ce que je suis en train de faire est déclarée une variable dans Scene.h et définir à partir de la fonction principale. Je ne suis pas sûr si je ne comprends pas inclure les gardes, mais je reçois des erreurs étranges:

'irr': n'est pas un nom de classe ou d'espace de noms erreur de syntaxe: manquant ';' avant '*' spécificateur de type manquant - int supposé. Note: C++ ne prend pas en charge par défaut-int

mais quand je déplace la ligne suivante dans le fichier de retour Main.cpp

irr::scene::ISceneManager* sceneManager; 

la compilation du programme. Quand suis-je incapable de le déclarer dans scene.h et de définir la valeur depuis la fonction principale?

+0

Dans ce fichier est 'irr :: scène :: ISceneManager' définie? – tmpearce

+0

Scene.h, tout en haut. – Kurieita

+0

Non, c'est là que vous déclarez une variable de type pointer-to-that-type. Où est ce ** type ** (classe ou struct) défini? – tmpearce

Répondre

3

Il est préférable de ne pas déclarer de variables dans les en-têtes. Il se termine mal plus souvent qu'autrement, car chaque fichier qui comprend l'en-tête fera leur propre sceneManager. Lorsque l'éditeur de liens arrive à mettre le programme ensemble, il peut trouver des dizaines de sceneManager tous avec une prétention égale à être le vrai sceneManager, jeter ses mains dans le dégoût, et les messages d'erreur de pulvérisation sur toute la console.

En scene.h ajouter

#include <irrlicht\irrlicht.h> 

au sommet de déclarer tous les bits et bobs de irrlicht afin qu'ils soient disponibles en scene.h.

changer ensuite

irr::scene::ISceneManager* sceneManager; 

à

extern irr::scene::ISceneManager* sceneManager; 

extern indique au compilateur que sceneManager existe et de stockage seront alloués ailleurs. Le compilateur sourit et continue, en laissant trier où l'un, vrai sceneManager est à l'éditeur de liens.

Enfin, mettre

irr::scene::ISceneManager* sceneManager; 

en Main.cpp pour allouer de la mémoire pour que l'éditeur de liens a un sceneManager à trouver.

Documentation on extern

lecture recommende: When to use extern in C++

+0

Très belle et très rapide réponse. Merci beaucoup +1 pour vous. :) – Kurieita

+0

Concis et explicatif. Une bonne réponse, +1. – frasnian

3

Vous déclarez que sceneManager est de type irr::scene::ISceneManager*, mais l'espace de noms irr n'existe pas lorsque vous déclarez cette variable. Ajoutez un include au fichier d'en-tête qui déclare cet espace de noms avant de déclarer votre variable. Après cela, vous devrez déclarer sceneManager comme étant extern dans l'en-tête afin que chaque unité de compilation qui inclut cet en-tête ne crée pas sa propre instance de la variable. Puis parce que c'est extern, vous voudrez également le redéclare (sans extern) dans main.cpp.