Partage
  • Partager sur Facebook
  • Partager sur Twitter

Erreur de compilation pour une classe

Sujet résolu
    19 novembre 2017 à 15:43:26

    Bonjour je suis débutant en C++, je suis le cours de Mathieu Nebra ( que je remercie infiniment pour la qualité de celui-ci ) mais je me retrouve confronté à un problème. En effet après la création du constructeur pour la classe Personnage.cpp ( celle utilisé dans le cours ) je me retrouve à la compilation avec ce message : 

     g++ main.cpp Personnage.cpp -o bin/main
    Personnage.cpp:9:5: error: redefinition of ‘Personnage::Personnage()’
         Personnage::Personnage() : m_vie(100), m_mana(100), m_nomArme(nomArme), m_degatsArme(degatsArme)
         ^
    Personnage.cpp:5:5: note: ‘Personnage::Personnage()’ previously defined here
         Personnage::Personnage() : m_vie(100), m_mana(100), m_nomArme("Epée rouillé"), m_degatsArme(10)
         ^
    

    Voici les différents code :

    main.cpp : 

    #include <iostream>
    #include <string>
    #include <fstream>
    #include "Personnage.h"
    using namespace std;
    
    int main(int argc, char const *argv[]) {
      Personnage David, Goliath;
      Goliath.attaquer(David);
      David.boirePotion(20);
      Goliath.attaquer(David);
      David.attaquer(Goliath);
      Goliath.changerArme("Tempesta", 17); //Petit clin d'oeil à Skyrim
      Goliath.attaquer(David);
    
      return 0;
    }
    

    Personnage.cpp

    #include "Personnage.h"
    #include <string>
    using namespace std;
    
        Personnage::Personnage() : m_vie(100), m_mana(100), m_nomArme("Epée rouillé"), m_degatsArme(10)
        {
    
        }
        Personnage::Personnage() : m_vie(100), m_mana(100), m_nomArme(nomArme), m_degatsArme(degatsArme)
        {
          
        }
        void Personnage::recevoirDegats(int nbDegats)
        {
          m_vie -= nbDegats;
    
          if (m_vie < 0)
          {
            m_vie = 0;
          }
        }
    
        void Personnage::attaquer(Personnage &cible)
        {
          cible.recevoirDegats(m_degatsArme);
        }
    
        void Personnage::changerArme(string nomArme, int degatsArme)
        {
          m_nomArme = nomArme;
          m_degatsArme = degatsArme;
    
        }
        void Personnage::boirePotion(int pointVie)
        {
          m_vie += pointVie;
    
          if (m_vie > 100)
          {
            m_vie = 100;
          }
        }
        bool Personnage::estVivant()
        {
          if (m_vie > 0)
          {
            return true;
          }
          else
          {
            return false;
          }
        }
    

    et Personnage.h : 

    #ifndef PERSONNAGE_H_INCLUDED
    #define PERSONNAGE_H_INCLUDED
    
    #include <string>
    class Personnage
    {
      private:
        int m_vie;
        int m_mana;
        std::string m_nomArme;
        int m_degatsArme;
      public:
        Personnage();
        Personnage(std::string nomArme, int degatsArme);
        void recevoirDegats(int nbDegats);
        void attaquer(Personnage &cible);
        void changerArme(std::string nomArme, int degatsArme);
        void boirePotion(int pointVie);
        bool estVivant();
    
    };
    
    
    #endif
    

    J'ai suuivi le cours à la lettre (enfin je crois ), merci de votre aide.





    • Partager sur Facebook
    • Partager sur Twitter
    Les forums sont des Dolipranes, il faut savoir les utiliser au bon moment.
      19 novembre 2017 à 16:02:42

      Lu'!

      WiliamJayberlinos a écrit:

      Bonjour je suis débutant en C++, je suis le cours de Mathieu Nebra ( que je remercie infiniment pour la qualité de celui-ci )

      Changes de cours. Il apprend un sacré paquet d'âneries à ne pas faire, en plus de montrer des exemples de code buggés et d'être obsolète (quelques recherches sur le forum t'en diront plus). Prends plutôt le cours de C++ de @gbdivers, même s'il est encore en écriture il ne contient pas ce genre de bavures. Si tu as des problèmes de compréhension sur une partie et que ce n'est pas à cause d'un manque d'étude du cours, tu peux poster ici. Si tu préfères un cours déjà complet, tourne toi vers le C++ Primer de Lippman dans sa dernière édition (en anglais), il sera un poil moins à jour mais c'est un bon cours.

      Par exemple ici, dans la liste des choses à ne pas faire montrés par juste cette partie sur l'objet (et sans même parler de la partie suivante sur le polymorphisme qui est une collection de choses à ne pas faire) :

      • utiliser "using namespace std" est une mauvaise pratique (raison + que faire),
      • la valeur "100" plusieurs fois présente dans le code, c'est la porte ouverte aux oublis de modification, déclare une constante avec un nom clair,
      • le type personnage a une sémantique d'entité, il devrait non copiable et non-affectable par copie,
      • (Le constructeur par défaut sur un type comme Personnage c'est une mauvaise idée).

      Concernant ton code, on notera également (en passage rapide) :

      • estVivant devrait être const (de même qu'attaquer en l'état actuel des choses),
      • bool Personnage::estVivant(){
          if (m_vie > 0){
            return true;
          } else {
            return false;
          }
        }
        Ou beaucoup plus simplement :
        bool Personnage::estVivant()
        {
          return m_vie > 0 ;
        }
        Parce que là tu nous dis "si quelque chose est vrai, retourner vrai, sinon si c'est faux, retourner faux", soit simple "retourner quelque chose".

      Finalement, concernant ton problème tu as créé deux implémentations pour le constructeur par défaut de Personnage :

      Personnage::Personnage() : m_vie(100), m_mana(100), m_nomArme("Epée rouillé"), m_degatsArme(10)
      {
       
      }
      Personnage::Personnage() : m_vie(100), m_mana(100), m_nomArme(nomArme), m_degatsArme(degatsArme)
      {
             
      }

      (Les deux fois, c'est Personnage() que tu implémentes). Or, toi, tu voulais une implémentation pour Personnage() et une pour Personnage(std::string nom, int degats).

      -
      Edité par Ksass`Peuk 19 novembre 2017 à 16:14:31

      • Partager sur Facebook
      • Partager sur Twitter

      Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C

        19 novembre 2017 à 16:50:49

        Merci pour le conseil je suis totalement débutant en C++ ( je codais en C# mais pour des raisons scolaires je dois étudier le c++ mais je ne comprends pas les explication de mon professeur), je vais me pencher sur le cours que tu m'as donné. Merci à toi.

        Bonne fin de journée 

        • Partager sur Facebook
        • Partager sur Twitter
        Les forums sont des Dolipranes, il faut savoir les utiliser au bon moment.

        Erreur de compilation pour une classe

        × 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