Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème de modularité

Classes interdépendantes + héritage

Sujet résolu
Anonyme
    26 juin 2007 à 10:07:37

    Bonjour à tous :) .

    J'ai actuellement un problème que je n'arrive pas à résoudre depuis un bon bout de temps...
    Je souhaitais faire un début de base de commencement d'entamement de moteur de jeu :-? . Pour ce faire, je me suis un peu basé sur ce tuto de developpez.

    J'ai donc, pour le moment, une classe Game, une classe Engine virtuelle, et ses classes dérivées, Graphics_engine, Game_engine et Sound_engine.
    Pour le moment, ces classes sont vides.
    Comme le problème se présente également avec seulement les classes Game_engine et Graphics_engine et pour ne pas encombrer le topic, je ne vous mets que celles-là :

    main.cpp
    #include "Game.h"

    int main()
    {
        Game game;
        return game.run();
    }

    Game.h
    #ifndef DEF_GAME_CYPRIEN
    #define DEF_GAME_CYPRIEN

    class Game_engine;
    class Graphics_engine;
    /* SOUND est defini a 0 */
    #if SOUND
    class Sound_engine;
    #endif

    class Game
    {
        public:
            Game();
            ~Game();
            void stop();
            int run();
        private:
            bool running;
            Game_engine* g;
            Graphics_engine* gfx;
    #if SOUND
            Sound_engine* s;
            #endif
    };

    #endif

    Game.cpp
    #include "Game.h"

    #include "Game_engine.h"
    #include "Graphics_engine.h"

    #if SOUND
    #include "Sound_engine.h"
    #endif

    Game::Game()
    {
        g = new Game_engine(this);
        gfx = new Graphics_engine(this);
    #if SOUND
        s = new Sound_engine(this);
        #endif

        running = true;
    }

    Game::~Game()
    {
        delete g;
        delete gfx;

    #if SOUND
        delete s;
        #endif
    }

    void Game::stop()
    {
        running = false;
    }

    int Game::run()
    {
        bool current_running = running;

        while(current_running)
        {
            g->frame();
            gfx->frame();
    #if SOUND
            s->frame();
    #endif
            current_running = running;
        }

        return 0;
    }

    Engine.h
    #ifndef DEF_ENGINE_CYPRIEN
    #define DEF_ENGINE_CYPRIEN

    #include <queue>
    #include <map>

    class Game;
    class Game_engine;
    class Graphics_engine;
    #if SOUND
    class Sound_engine;
    #endif

    typedef struct engine_event
    {

    } engine_event;

    class Engine
    {
        public:
            Engine(Game* game);

            virtual ~Engine() { }

            void push_event(engine_event& e);

            void process_queue();

            void attach_game_engine(Game_Engine* en);
    #if SOUND
            void attach_sound_engine(Graphics_Engine* en);
    #endif
            void attach_graphics_engine(Sound_Engine* en);

            virtual void frame() =0;
        protected:
            Game* parent;
            std::queue<engine_event> events;
            virtual void process_event(engine_event& e) =0;
            Game_engine* g;
            Graphics_engine* gfx;
    #if SOUND
            Sound_engine* s;
    #endif
    };

    #endif

    Engine.cpp
    #include "Engine.h"

    class Game;

    Engine::Engine(Game* game)
    {
        parent = game;
    }

    void Engine::push_event(engine_event& e)
    {
        events.push(e);
    }

    void Engine::process_queue()
    {
        while(!events.empty())
        {
            engine_event& e = events.front();
            events.pop();
            process_event(e);
        }
    }

    void Engine::attach_game_engine(Game_Engine* en) { g = en; }
    #if SOUND
    void Engine::attach_sound_engine(Sound_engine* en) { s = en; }
    #endif
    void Engine::attach_graphics_engine(Graphics_engine* en) { gfx = en; }

    Game_engine.h
    #ifndef GAME_ENGINE_CYPRIEN
    #define GAME_ENGINE_CYPRIEN

    #include "Engine.h"

    class Game;

    class Game_engine : public Engine
    {
        public:
            Game_engine(Game* game);
            ~Game_engine();
            void frame();
        private:
            void process_event(engine_event& e);
    };

    #endif

    Game_engine.cpp
    #include "Game_engine.h"
    #include "Game.h"

    Game_engine::Game_engine(Game* game) : Engine(game)
    {

    }

    Game_engine::~Game_engine()
    {

    }

    void Game_engine::frame()
    {
        parent->stop();
    }

    void Game_engine::process_event(engine_event& e)
    {

    }

    Graphics_engine.h
    #ifndef GRAPHICS_ENGINE_CYPRIEN
    #define GRAPHICS_ENGINE_CYPRIEN

    #include "Engine.h"

    class Game;

    class Graphics_engine : public Engine
    {
        public:
            Graphics_engine(Game* game);
            ~Graphics_engine();
            void frame();
        private:
            void process_event(engine_event& e);
    };

    #endif

    Graphics_engine.cpp
    #include "Graphics_engine.h"
    #include "Game.h"

    Graphics_engine::Graphics_engine(Game* game) : Engine(game)
    {

    }

    Graphics_engine::~Graphics_engine()
    {

    }

    void Graphics_engine::frame()
    {

    }

    void Graphics_engine::process_event(engine_event& e)
    {

    }


    Ouf ! Maintenant, les erreurs du compilateur:
    C:\Engine.h:30: error: variable or field `attach_game_engine' declared void
    Engine.h:30: error: expected `;' before '(' token
    Engine.h:34: error: variable or field `attach_graphics_engine' declared void
    Engine.h:34: error: expected `;' before '(' token
    :: === Build finished: 6 errors, 9 warnings ===



    Pour le code, pour le moment, son unique but, c'est d'afficher un joyeux "Process terminated with status 0" :D .
    Vous pouvez aussi voir que mes includes et déclarations anticipées sont mises un peu au hasard dans mes fichiers, c'est d'ailleurs pour ça que je fais appel à vous ;) .

    Je remercie d'avance quiconque voudra bien prêter un peu de sont temps à la résolution ce problème :) .
    • Partager sur Facebook
    • Partager sur Twitter
      26 juin 2007 à 14:15:37

      salut

      y'a beaucoup de chose là dis moi ^^ Aparement c'est Engine.h qui bug, pourquoi tu n'y inclues pas directement Game_engine.h, Graphic_Engine.h (et sound blabla), puisque tu utilises cette classe comme type des paramètres des fonctions qui bug ?

      tu fais :
      class Game;
      class Game_engine;
      class Graphics_engine;
      mais l'inclusion à la place des fichiers me semble plus approprié


      et en passant dans engine.h tu fais ça:
      #define DEF_ENGINE_CYPRIEN
      #ifndef DEF_ENGINE_CYPRIEN
      #define DEF_ENGINE_CYPRIEN

      quel intéret de la définir, puis de tester s'il est défini et enfin de le redéfinir ?
      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        26 juin 2007 à 14:28:19

        Désolé pour les defines, erreur de ma part en copiant-collant, en fait ils sont normaux ^^ .

        J'avais déjà essayé en remplaçant les déclarations anticipées par des includes, mais ça me fait les même erreurs en en rajoutant une:

        Graphics_engine.h:9: error: expected class-name before '{' token


        En fait, je pense avoir essayé à peu près toutes les dispositions d'includes/déclarations anticipées qui sont à ma connaissance, et celle que j'ai présentée dans mon premier topic est celle qui génère le moins d'erreurs...

        Merci quand même d'avoir bien voulu t'attarder sur mon problème :) .

        EDIT: c'est pas possible, vive l'erreur :waw: . En fait, j'avais mis une majuscule au engine de Game_engine et Graphics_engine :honte: .
        Bon ben désolé d'avoir tenté d'abuser de votre patience...
        • Partager sur Facebook
        • Partager sur Twitter

        Problème de modularité

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown