Partage
  • Partager sur Facebook
  • Partager sur Twitter

Probleme avec des includes.

Erreur a la compilation.

Sujet résolu
    28 avril 2006 à 17:03:32

    Salut a tous.

    Voila mon probleme survient la compilation.
    Je code un jeu dans lequel j'utilise des players et des monstres (ca parait dingue^^). J'ai donc créé une classe PlayerBattle et une classe MonsterBattle.
    Le probleme est que dans chacune des classes, une méthode de celle ci prend en parametre l'autre classe. C'est assez compliquer a expliquer mais facile a comprendre avec un bout de code.
    ( Je ne fournis qu'une partie tres restreinte de mon code suffisante pour resoudre le probleme. Donc il est normal que mon code ne serve a rien, qu'il y ai un system("PAUSE") alors qu'il faille eviter de l'utiliser...)

    Il y a 5 fichiers: un .h et un .cpp pour chacune des deux classes et le main.cpp .

    Voici un lien pour telecharger les fichiers du projet:
    Cliquez ici

    Pour ceux qui voudraient jeter un coup d'oeil au code sans telecharger, le voici:

    - main.cpp


    #include <string>
    #include <math.h>
    #include <time.h>

    #include "C_PlayerBattle.h"
    #include "C_MonsterBattle.h"

    int main(int argc, char *argv[])
    {
        long exit=0;

          //==========BOUCLE PRINCIPALE==========
        while (exit==0)
        {
            printf("Code produisant une erreur a la compilation :s");
            system("PAUSE");
            exit=1;
        }

        return 0;
    }






    - C_PlayerBattle.h
    #ifndef _CLASS_PLAYER_BATTLE_H
    #define _CLASS_PLAYER_BATTLE_H


    #include "C_MonsterBattle.h"


    using namespace std ;


    class PlayerBattle
    {
        private:
            long force;
            long endurance;
            long dexterite;

        public:

            // Constructeur.
            PlayerBattle();

            // Destructeur.
            ~PlayerBattle();

            void Attack(MonsterBattle monstre);
    };

    #endif



    - C_PlayerBattle.cpp
    #include "C_PlayerBattle.h"


    PlayerBattle::PlayerBattle()
    {
        force=10;
        endurance=7;
        dexterite=3;
    }

    PlayerBattle::~PlayerBattle()
    {
    }

    void PlayerBattle::Attack(MonsterBattle monstre)
    {
        //ma fonction pour ke le joueur attake le monstre
    }


    - C_MonsterBattle.h
    #ifndef _CLASS_MONSTER_BATTLE_H
    #define _CLASS_MONSTER_BATTLE_H


    #include "C_PlayerBattle.h"

    using namespace std ;

    class MonsterBattle
    {
        private:
            double lifeMax;
            double life;
            double manaMax;
            double mana;

        public:

            // Constructeur.
            MonsterBattle();

            // Destructeur.
            ~MonsterBattle();

            void UpdateMonster(PlayerBattle* player);
    };

    #endif


    - et C_MonsterBattle.cpp

    #include "C_MonsterBattle.h"

    MonsterBattle::MonsterBattle()
    {
        lifeMax=200;
        life=lifeMax-20;
        manaMax=75;
        mana=manaMax-2;
    }

    MonsterBattle::~MonsterBattle()
    {
    }

    void MonsterBattle::UpdateMonster(PlayerBattle* player)
    {
        //ma fonction qui update le monstre en fonction du joueur
    }



    Voilou.
    Merci d'avance pour votre aide.
    + !NiCo!
    • Partager sur Facebook
    • Partager sur Twitter
      28 avril 2006 à 17:14:30

      Lol, c'est vrai desolé.
      Voila l'erreur que le compilateur me renvoie:

      File: -- Message:
      C_MonsterBattle.h -- error: 'PlayerBattle' has not been declared
      C_MonsterBattle.h -- error: ISO C++ forbids declaration of 'player' with no type


      il faudrait que j'arrive a compiler le tout en pouvant me servir de chaque classe dans l'autre et sans erreur.

      Merci
      • Partager sur Facebook
      • Partager sur Twitter
        29 avril 2006 à 9:46:00

        Salut, je me permet d'upper mon topic car je n'arrive toujours pas a trouver de solution malgré mes recherches et que je suis totalement bloqué.
        + !NiCo!
        • Partager sur Facebook
        • Partager sur Twitter
          29 avril 2006 à 9:58:46

          T'es sûr que c'est du C++ ? Même moi qui n'y connais rien, je crois que pour ecrire, c'est cout, nan ?
          • Partager sur Facebook
          • Partager sur Twitter
            29 avril 2006 à 11:05:10

            Lol ué je sais mais on s'en fout du printf je l'ai mis la pour faire beau et c'est pas lui qui cause l'erreur
            • Partager sur Facebook
            • Partager sur Twitter
              29 avril 2006 à 11:19:59

              Le mieux c'est prendre tout les includes et les mettres dans un .h et dans les autres fichiers essayer d'include ce fichier .h
              • Partager sur Facebook
              • Partager sur Twitter
                29 avril 2006 à 11:31:12

                Citation : florent28

                Quelle est ton erreur ?


                • Je suis une brèle en C++
                • Il faut que tu choissise si tu fais du C ou du C++
                • Tu as des références de classes croisées. Comme tu as astucieusement mis un pointeur, tu peux faire une définition partielle class nomd_de_la_classe; avant usage.

                Voilà ton code corrigé :

                /* main.cpp */
                #include <iostream>

                #include "C_PlayerBattle.h"
                #include "C_MonsterBattle.h"

                int main()
                {
                   int exit = 0;

                   //==========BOUCLE PRINCIPALE==========
                   while (exit == 0)
                   {
                      cout << "OK" << endl;
                      exit = 1;
                   }

                   return 0;
                }



                /* C_MonsterBattle.h */
                #ifndef _CLASS_MONSTER_BATTLE_H
                #define _CLASS_MONSTER_BATTLE_H

                #include "C_PlayerBattle.h"

                using namespace std ;

                class MonsterBattle
                {
                private:
                   double lifeMax;
                   double life;
                   double manaMax;
                   double mana;

                public:

                   // Constructeur.
                   MonsterBattle();

                   // Destructeur.
                   ~MonsterBattle();

                   void UpdateMonster(PlayerBattle player);
                };

                #endif



                /* C_PlayerBattle.h */
                #ifndef _CLASS_PLAYER_BATTLE_H
                #define _CLASS_PLAYER_BATTLE_H

                using namespace std ;

                /* -ed- */
                class MonsterBattle;

                class PlayerBattle
                {
                    private:
                        long force;
                        long endurance;
                        long dexterite;

                    public:

                        // Constructeur.
                        PlayerBattle();

                        // Destructeur.
                        ~PlayerBattle();

                        void Attack(MonsterBattle* monstre);
                };

                #endif



                /* C_PlayerBattle.cpp */
                #include "C_PlayerBattle.h"

                PlayerBattle::PlayerBattle()
                {
                    force=10;
                    endurance=7;
                    dexterite=3;
                }

                PlayerBattle::~PlayerBattle()
                {
                }

                /* -ed- */
                void PlayerBattle::Attack(MonsterBattle* monstre)
                {
                    //ma fonction pour que le joueur attaque le monstre
                }



                /* C_MonsterBattle.cpp */

                #include "C_MonsterBattle.h"

                MonsterBattle::MonsterBattle()
                {
                   lifeMax = 200;
                   life = lifeMax - 20;
                   manaMax = 75;
                   mana = manaMax - 2;
                }

                MonsterBattle::~MonsterBattle()
                {
                }

                void MonsterBattle::UpdateMonster(PlayerBattle player)
                {
                   //ma fonction qui update le monstre en fonction du joueur
                }

                • Partager sur Facebook
                • Partager sur Twitter
                Music only !
                  29 avril 2006 à 11:38:54

                  Ce que je pense surtout c'est que dans l'ordre d'inclusion tu as d'abord MonsterBattle.h d'inclus, dans lequel tu as des références à des variables de PlayerBattle, pour le compilo après le Linkage les variables n'ont pas été déclarées...
                  Lui il recoit ça comme ça après le passage du linker:


                  /* Contenu de string */
                  /* Contenu de math.h */
                  /* Contenu de time.h */
                  /* Je les réécrit pas, c'est un peu long ^^ */

                  using namespace std ;

                  class MonsterBattle
                  {
                      private:
                          double lifeMax;
                          double life;
                          double manaMax;
                          double mana;

                      public:

                          // Constructeur.
                          MonsterBattle();

                          // Destructeur.
                          ~MonsterBattle();

                          void UpdateMonster(PlayerBattle* player);
                  };


                  using namespace std ;

                  class PlayerBattle
                  {
                      private:
                          long force;
                          long endurance;
                          long dexterite;

                      public:

                          // Constructeur.
                          PlayerBattle();

                          // Destructeur.
                          ~PlayerBattle();

                          void Attack(MonsterBattle monstre);
                  };


                  int main(int argc, char *argv[])
                  {
                      long exit=0;

                        //==========BOUCLE PRINCIPALE==========
                      while (exit==0)
                      {
                          printf("Code produisant une erreur a la compilation :s");
                          system("PAUSE");
                          exit=1;
                      }

                      return 0;
                  }


                  J'ai juste remplacé les #include par le contenu du fichier inclus:
                  D'abord PlayerBAttle.h est inclus, pendant l'inclusion CLASS_PLAYER_BATTLE_H est définit, après la définition le fichier MonsterBattle.h est inclus, dedans est définit CLASS_MONSTER_BATTLE_H, puis il y a une demande d'inclusion de PlayerBattle.h, le linker va revoir dedans mais CLASS_PLAYER_BATTLE_H est déjà définit donc il ne fait rien, il retourne donc à MonsterBattle.h, inclut son contenu, puis une fois ceci fait il revient à PlayerBattle.h est finit le remplissage...
                  Ensuite dans ton main.cpp tu demandes à nouveaux d'inclure MonsterBattle.h mais CLASS_MONSTER_BATTLE_H est déjà défini donc il ne fait rien, et finit par mettre la fin du main...
                  Au final tu fais des aller-retour dans tes fichiers mais l'ordre réél d'inclusion est:
                  MonsterBattle.h puis PlayerBattle.h puis main.cpp
                  Or dans MonsterBattle.h tu fais appel à un pointeur sur classe de type que tu définis dans PlayerBattle.h (class PlayerBattle), au moment ou le compilo arrive ici il ne connait pas encore PlayerBattle, et renvoie une erreur...

                  Donc même si à première vue on voit que chacun est inclus au début de l'autre et qu'il pourrait semble que c'est déjà définit, il faut penser comme un linker et voir un peu dans l'ordre ce que ça donne...

                  Voilà, j'espère avoir été claire, j'avais vu le sujet hier mais un peu flemmard j'ai espéré que quelqu'un passe t'expliquer le problème avant ce matin mais bon personne n'est venu donc comme ça c'est fait même si c'est pas super super clair...
                  • Partager sur Facebook
                  • Partager sur Twitter
                    29 avril 2006 à 11:46:57

                    ok merci bcp vais voir ca tout de suite

                    EDIT:
                    Ok ca marche, c'est magnifique.
                    Merci beaucoup a tous pour votre aide precieuse.

                    + !NiCo!
                    • Partager sur Facebook
                    • Partager sur Twitter

                    Probleme avec des includes.

                    × 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