Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2005
    Messaggi
    95

    [C++] header che si includono a vicenda

    salve! io ho 2 header con ognuno una classe
    così:

    //file game.h
    #include "gun.h"

    class game{
    public:
    Gun* gun;
    }

    //file gun.h
    #include "game.h"

    class gun{
    public:
    gun(Game* game);
    }


    se provo a compilare questo codice il programma va in loop perchè ovviamente avviene un ciclo chiuso, un header include un header che a sua volta re-include l'header di partenza etc...

    ma la classe "game" ha bisogno della classe "gun" per avere un puntatore a questa classe tra i membri, mentre la classe "gun" ha bisogno della classe "game" per il costruttore.

    come faccio?

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Nei file di include è consuetudine mettere un qualcosa del tipo:

    codice:
    #ifndef _NOMEHEADER_H
    #define _NOMEHEADER_H
    
       tutto il resto (include, definizioni, ecc...)
    
    #endif
    Dove NOMEHEADER ovviamente è il nome del tuo header. Il motivo è semplice: evitare che le definizioni vengano incluse più volte (cosa che oltretutto causerebbe errori!).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2005
    Messaggi
    95
    uffa...non va. ma questo serve per fare in modo che l'header venga incluso una sola volta in ogni file dove è incluso?
    Nel mio progetto ci sono questi header che oltre a includersi a vicenda vengono anche inclusi in due .cpp differenti. Praticamente con il codice che mi hai dato i file si includono nei cpp ma non si includono a vicenda

  4. #4
    Non vorrei dire una boiata, ma forse inserendo un #pragma once (se supportato dal compilatore) in ogni file di intestazione si potrebbe risolvere il problema.
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    Originariamente inviato da MItaly
    Non vorrei dire una boiata, ma forse inserendo un #pragma once (se supportato dal compilatore) in ogni file di intestazione si potrebbe risolvere il problema.
    Non è una boiata.
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  6. #6
    Utente di HTML.it
    Registrato dal
    Dec 2005
    Messaggi
    95
    dando un occhiata su altri header ho notato che risolvono questo problema come dite voi...ma a me non funziona ancora. gli header si includono ai cpp ma non a vicenda. Vi posto il codice

    codice:
    //file game.h
    #ifndef _GAME_H_
    #define _GAME_H_
    
    #include "Gun.h"
    #include <irrlicht.h>
    using namespace irr;
    using namespace core;
    using namespace video;
    using namespace scene;
    using namespace gui;
    
    class Game : public IEventReceiver
    {
    public:
    
    	Game(bool fullscreen, bool music, bool shadows, bool additive, bool vsync, video::E_DRIVER_TYPE driver);
    
    	~Game();
    
    	void run();
    
    	virtual bool OnEvent(SEvent event);
    
    //funzioni
    	void loadSceneData();
            void prepare();
            void setCamera();
    
    
    	bool fullscreen;
    	bool music;
    	bool shadows;
    	bool additive;
    	bool vsync;
    
    	ICameraSceneNode* camera;
    	E_DRIVER_TYPE driverType;
    
    //solite robe
        IrrlichtDevice *device;
        IVideoDriver* driver;
        ISceneManager* smgr;
        IGUIEnvironment* guienv;
    
    //objects
    
        Gun* gun;//<------------------------------ERRORE!!!
    };
    
    #endif
    
    //file gun.h
    
    #ifndef _GUN_H_
    #define _GUN_H_
    
    #include <irrlicht.h>
    #include "game.h"
    
    
    using namespace irr;
    using namespace core;
    using namespace video;
    using namespace scene;
    using namespace gui;
    
    class Gun
    {
        private:
            //solite robe
            IrrlichtDevice *device;
            IVideoDriver* driver;
            ISceneManager* smgr;
            IGUIEnvironment* guienv;
    
            //camera
            ICameraSceneNode* camera;
    
            //Gun node & mesh
            IAnimatedMesh* gun_mesh;
            IAnimatedMeshSceneNode* gun_node;
        
        public:
        Gun(Game* game);//<-------------------ERRORE!!!
        ~Gun();
    
    };
    #endif

  7. #7
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    E' normale che ti dia quegli errori poichè hai sbagliato.
    Non puoi mettere in un file .h questo

    codice:
    Gun(Game* game);//<-------------------ERRORE!!!
    ]
    Poichè tu dichiari e definisci la classe game proprio nel file .cpp!
    Come può quindi sapere il file .h cosa sia game?
    Per risolvere il problema devi fare la dichiarazione anticipata. Praticamente nel file gun.h dopo i soliti ifndef e define, aggiugi
    codice:
    class Game; //dichiarazione anticipata
    ]
    In questo modo dovrebbe compilare bene
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  8. #8
    Utente di HTML.it
    Registrato dal
    Dec 2005
    Messaggi
    95
    WoW! non lo sapevo!

  9. #9
    Utente di HTML.it
    Registrato dal
    Dec 2005
    Messaggi
    95
    Grazie mille XWolverineX

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.