Partage
  • Partager sur Facebook
  • Partager sur Twitter

POO

les constructeurs

    4 avril 2008 à 20:36:08

    Bonjours je en train de suivre le tuto de m@teo
    sur le c++ mais quand je veux créer un constructeur je mets:
    Personnage.cpp

    Citation : undefined


    Personnage::Personnage()
    {
    m_vie = 100;
    m_mana = 100;
    m_nomArme = "Epée rouillée";
    m_degatsArme = 10;
    }



    Personnage.h

    Citation : undefined


    Personnage();


    et il me met:

    Citation : undefined


    multiple definition of `Personnage::Personnage()'
    first defined here
    [Linker error] undefined reference to `Personnage::recevoirDegats(int)'
    ld returned 1 exit status
    C:\Documents and Settings\Grataloup\Bureau\C++\Makefile.win [Build Error] [POO.exe] Error 1


    que dois-je faire pour remedier à ce probleme.
    Merci
    Albin


    • Partager sur Facebook
    • Partager sur Twitter
      4 avril 2008 à 20:43:21

      le main.c:

      Citation : main.c


      #include <iostream>
      #include <string>
      #include "Personnage.h" // Ne pas oublier

      using namespace std;


      int main()
      {
      Personnage david, goliath; // Création de 2 objets de type Personnage : david et goliath

      goliath.attaquer(david); // goliath attaque david
      david.boirePotionDeVie(20); // david boit une potion de vie qui lui rapporte 20 de vie
      goliath.attaquer(david); // goliath réattaque david
      david.attaquer(goliath); // david contre-attaque... c'est assez clair non ? ^^
      goliath.changerArme("Double hache tranchante vénéneuse de la mort", 40);
      goliath.attaquer(david);


      return 0;
      }



      Citation : personnage.h


      #ifndef DEF_PERSONNAGE
      #define DEF_PERSONNAGE



      class Personnage
      {
      public:

      Personnage();
      void recevoirDegats(int nbDegats);
      void attaquer(Personnage &cible);
      void boirePotionDeVie(int quantitePotion);
      void changerArme(std::string nomNouvelleArme, int degatsNouvelleArme);
      bool estVivant();


      private:

      int m_vie;
      int m_mana;
      std::string m_nomArme;
      int m_degatsArme;
      };

      #endif



      Citation : Personnage.cpp



      #include <string>
      #include "Personnage.h"

      using namespace std;

      Personnage::Personnage()
      {
      m_vie = 100;
      m_mana = 100;
      m_nomArme = "Epée rouillée";
      m_degatsArme = 10;
      }
      void Personnage::attaquer(Personnage &cible)
      {
      cible.recevoirDegats(m_degatsArme); // On inflige à la cible les dégâts que causent notre arme
      }

      void Personnage::boirePotionDeVie(int quantitePotion)
      {
      m_vie += quantitePotion;

      if (m_vie > 100) // Interdiction de dépasser 100 de vie
      {
      m_vie = 100;
      }
      }

      void Personnage::changerArme(string nomNouvelleArme, int degatsNouvelleArme)
      {
      m_nomArme = nomNouvelleArme;
      m_degatsArme = degatsNouvelleArme;
      }

      bool Personnage::estVivant()
      {
      if (m_vie > 0) // Plus de 0 de vie ?
      {
      return true; // VRAI, il est vivant !
      }
      else
      {
      return false; // FAUX, il n'est plus vivant !
      }
      }



      voila tout le code, j'esperre que quelqu'un pourras m'aider
      Albin
      • Partager sur Facebook
      • Partager sur Twitter
        5 avril 2008 à 10:28:15

        Dans ton programme tu utilises une fonction membre de Personnage nommée recevoirDegats, comme cette fonction est déclarée le compilateur ne dit rien, mais le linker ne trouve aucune trace de cette fameuse fonction recevoirDegats, donc il sort une erreur.
        • Partager sur Facebook
        • Partager sur Twitter
        Mettre à jour le MinGW Gcc sur Code::Blocks. Du code qui n'existe pas ne contient pas de bug
          5 avril 2008 à 10:56:56

          En faite, tu n'as pas défini la méthode recevoirDegats dans ton Personnage.cpp .
          Donc lorsque la méthode attaquer est utilisée, elle renvoie une erreure car elle a besoin de la méthode recevoirDégats qui elle n'est pas défini.

          Je crois que c'est ça :euh:
          • Partager sur Facebook
          • Partager sur Twitter
            5 avril 2008 à 11:42:53

            on doit mettre void Personnage::recevoirDegats?
            je pense pas puisque ce n'est pas une methode de type void mais Personnage (je sais qu'on peut faire long long double mais la , je crois pas^^)

            je vais verifier mes classes
            • Partager sur Facebook
            • Partager sur Twitter
              5 avril 2008 à 18:10:08

              OK j'ai fait les modification ca donne:

              Citation : main.cpp



              #include <iostream>
              #include <string>
              #include "Personnage.h" // Ne pas oublier

              using namespace std;


              int main()
              {
              Personnage david, goliath; // Création de 2 objets de type Personnage : david et goliath

              goliath.attaquer(david); // goliath attaque david
              david.boirePotionDeVie(20); // david boit une potion de vie qui lui rapporte 20 de vie
              goliath.attaquer(david); // goliath réattaque david
              david.attaquer(goliath); // david contre-attaque... c'est assez clair non ? ^^
              goliath.changerArme("Double hache tranchante vénéneuse de la mort", 40);
              goliath.attaquer(david);


              return 0;
              }

              Citation : Personnage.cpp



              #include <string>
              #include "Personnage.h"

              using namespace std;
              Personnage::Personnage()
              {
              m_vie = 100;
              m_mana = 100;
              m_nomArme = "Epée rouillée";
              m_degatsArme = 10;
              }
              void Personnage::recevoirDegats(int nbDegats)
              {
              m_vie -= nbDegats;

              if (m_vie < 0)
              {
              m_vie = 0;
              }
              }

              void Personnage::attaquer(Personnage &cible)
              {
              cible.recevoirDegats(m_degatsArme); // On inflige à la cible les dégâts que causent notre arme
              }

              void Personnage::boirePotionDeVie(int quantitePotion)
              {
              m_vie += quantitePotion;

              if (m_vie > 100) // Interdiction de dépasser 100 de vie
              {
              m_vie = 100;
              }
              }

              void Personnage::changerArme(string nomNouvelleArme, int degatsNouvelleArme)
              {
              m_nomArme = nomNouvelleArme;
              m_degatsArme = degatsNouvelleArme;
              }

              bool Personnage::estVivant()
              {
              if (m_vie > 0) // Plus de 0 de vie ?
              {
              return true; // VRAI, il est vivant !
              }
              else
              {
              return false; // FAUX, il n'est plus vivant !
              }
              }


              Citation : Personnage .h



              #ifndef DEF_PERSONNAGE
              #define DEF_PERSONNAGE



              class Personnage
              {
              public:

              Personnage();
              void recevoirDegats(int nbDegats);
              void attaquer(Personnage &cible);
              void boirePotionDeVie(int quantitePotion);
              void changerArme(std::string nomNouvelleArme, int degatsNouvelleArme);
              bool estVivant();


              private:

              int m_vie;
              int m_mana;
              std::string m_nomArme;
              int m_degatsArme;
              };

              #endif


              IL me met toujours l'erreur sauf si j'enleve

              Citation : PARTIE FAUSSE:



              Personnage::Personnage()
              {
              m_vie = 100;
              m_mana = 100;
              m_nomArme = "Epée rouillée";
              m_degatsArme = 10;
              }


              Alors que dois-je faire?
              Albin
              • Partager sur Facebook
              • Partager sur Twitter
                5 avril 2008 à 18:36:16

                Citation : danman

                on doit mettre void Personnage::recevoirDegats?
                je pense pas puisque ce n'est pas une méthode de type void mais Personnage (je sais qu'on peut faire long long double mais la , je crois pas^^)

                je vais verifier mes classes



                Houla !!! Je te conseil TRÈS VIVEMENT de revoir le chapitre sur les fonctions du cours sur le C : void (ou int, long, double ...) donne le type de variable que renvoie la fonction, Personnage, c'est la classe à qui appartiens la fonction, ça n'a rien à voir!!!!
                • Partager sur Facebook
                • Partager sur Twitter
                  7 avril 2008 à 12:11:34

                  est-ce que quelequ'un peut m'aider à corriger mon code cidessus s'il vous plait car je ne comprend pas mon erreur.
                  Merci d'avance
                  @lbin
                  • Partager sur Facebook
                  • Partager sur Twitter
                    7 avril 2008 à 12:31:20

                    Citation : albin12

                    Alors que dois-je faire?


                    Apprendre à utiliser les balises <code>,histoire qu'on puisse y voir claire...
                    • Partager sur Facebook
                    • Partager sur Twitter
                      7 avril 2008 à 15:59:56

                      Sans oublier l'indentation incrémentée de 4 espaces par blocs!

                      1. <code type="cpp" >// Mon code!</code >


                      sans les espaces avant les chevrons fermants.
                      • Partager sur Facebook
                      • Partager sur Twitter

                      POO

                      × 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