Partage
  • Partager sur Facebook
  • Partager sur Twitter

Surcharge de constructeur qui fonctionne pas

Anonyme
    17 avril 2018 à 1:08:01

    Bonjour !

    Je me lance tout juste dans le C++ en suivant le cours du site et j'en suis à la partie sur la surcharge de constructeur, j'ai essayé de recoder de mémoire l'exemple pour m'entrainer en adaptant un peu le thème et j'ai fait ça:

    Pokemon.h

    #ifndef POKEMON_H
    #define POKEMON_H
    
    #include <string>
    
    class Pokemon
    {
     public:
      Pokemon();
      Pokemon(int pointDeVie, int vitesse, std::string nomAttaque, int degatsAttaque);
      void attaque(Pokemon &cible);
      bool estVivant();
      int vitesse();
      void perdreVie(int degatsAttaque);
     private:
      int m_pointDeVie;
      int m_vitesse;
      std::string m_nomAttaque;
      int m_degatsAttaque;
    };
    
    #endif

     pokemon.cpp:

    #include <string>
    #include "Pokemon.h"
    using namespace std;
    
    Pokemon::Pokemon() : m_pointDeVie(100), m_vitesse(100), m_nomAttaque("Trempette"), m_degatsAttaque(50)
    {
    }
    
    Pokemon::Pokemon(int pointDeVie, int vitesse, string nomAttaque, int degatsAttaque)
    {
    }
    
    void Pokemon::attaque(Pokemon &cible)
    {
      cible.perdreVie(m_degatsAttaque);
    }
    
    bool Pokemon::estVivant()
    {
      return m_pointDeVie > 0;
    }
    
    int Pokemon::vitesse()
    {
      return m_vitesse;
    }
    
    void Pokemon::perdreVie(int degatsAttaque)
    {
      m_pointDeVie -= degatsAttaque;
      if (m_pointDeVie < 0)
        m_pointDeVie = 0;
    }

    main.cpp:

    #include <iostream>
    #include "Pokemon.h"
    using namespace std;
    
    int main()
    {
      Pokemon pikachu(35, 90, "Eclair", 40), evoli(55, 55, "Charge", 40);
      //  Pokemon pikachu, evoli;
      cout << pikachu.vitesse() << evoli.vitesse() << endl;
      if (pikachu.vitesse() >= evoli.vitesse())
        {
          cout << "lol" << endl;
          while (pikachu.estVivant() && evoli.estVivant())
    	{
    	  pikachu.attaque(evoli);
    	  if (!evoli.estVivant())
    	    {
    	      cout << "Pikachu a gagné" << endl;
    	      return 0;
    	    }
    	  evoli.attaque(pikachu);
    	  if (!pikachu.estVivant())
    	    {
    	      cout << "Evoli a gagné" << endl;
    	      return 0;
    	    }
    	}
        }
      else
        {
          while (pikachu.estVivant() && evoli.estVivant())
    	{
    	  evoli.attaque(pikachu);
    	  if (!pikachu.estVivant())
    	    {
    	      cout << "Evoli a gagné" << endl;
    	      return 0;
    	    }
    	  pikachu.attaque(evoli);
    	  if (!evoli.estVivant())
    	    {
    	      cout << "Pikachu a gagné" << endl;
    	      return 0;
    	    }
    	}
        }
      return 0;
    }

    Visiblement ça marche quand j'utilise le constructeur par défaut mais si j'utilise le deuxième constructeur le programme n'affecte pas la valeur indiquée à "vitesse" (seul paramètre que je peux tester vu que j'ai une méthode pour ça) et affecte la valeur 0 à celle de Pikachu et la  valeur 32765 à celle d'Evoli, par ailleurs ça affiche aléatoire "pikachu a gagné", parfois ça le met, parfois non.

    J'ai bien sûr essayé de recomparer avec l''exemple du cours après coup mais j'arrive pas à voir ce que j'ai fait différemment, c'est sûrement tout bête mais je vois pas :/

    Si quelqu'un peut m'aider ! :)

    Merci


    -
    Edité par Anonyme 17 avril 2018 à 1:49:31

    • Partager sur Facebook
    • Partager sur Twitter
      17 avril 2018 à 1:46:31

      Bonjour,

      Le constructeur avec des paramètres, reçoit des paramètres mais n'en fait rien. Le compilateur a du aussi indiquer 4 warnings.

      Pokemon::Pokemon(int pointDeVie, int vitesse, string nomAttaque, int degatsAttaque)
       : m_pointDeVie(pointDeVie) , m_vitesse(vitesse) , m_nomAttaque(nomAttaque) , m_degatsAttaque(degatsAttaque)
      {
      }



      • Partager sur Facebook
      • Partager sur Twitter

      En recherche d'emploi.

      Anonyme
        17 avril 2018 à 1:57:43

        Merci c'est ça ! J'avais pas compris du tout je pensais qu'il repérait tout seul sans me rendre compte que c'était idiot x)

        J'avais pas de warning avec g++ par contre 

        • Partager sur Facebook
        • Partager sur Twitter
          18 avril 2018 à 11:36:15

          à recoder dans l'autre sens, avec une délégation de constructeur (C++11).

          Le constructeur avec paramètre fait le boulot laborieux d'initialisation des champs un par un, le constructeur par défaut lui fournit les valeurs par défaut. Chacun son job, inutile de faire deux fois le boulot.

          Utiliser de préférence l'initialisation uniforme avec { }.

          Pokemon::Pokemon() 
           : Pokemon {100, 100, "Trempette", 50}  // délégation
          {
          }
           
          Pokemon::Pokemon(int pointDeVie, int vitesse, string nomAttaque, int degatsAttaque)
             : m_pointDeVie   {pointDeVie}
             , m_vitesse      {vitesse},
             , m_nomAttaque   {nom_attaque}
             , m_degatsAttaque{degatsAttaque}
          {
          }


          les warnings : il faut configurer l'IDE pour qu'il demande au compilateur de le les présenter. -Wall -Wextra pour g++.

          -
          Edité par michelbillaud 18 avril 2018 à 11:38:50

          • Partager sur Facebook
          • Partager sur Twitter
            18 avril 2018 à 16:35:59

            Bonjour,

            J'ai lu que tu suis le cours c++ de ce site... Il est obsolète(basé sur un standard ancien) et non ce n'est pas un troll. Suis plutôt le cours de Guillaume Belz (alias GBdivers sur ce forum) tu y gagneras : http://guillaume.belz.free.fr/doku.php?id=start 

            ce dernier cours est basé sur les derniers standards du c++ (c++14 / c++17).

            -
            Edité par Warren79 18 avril 2018 à 16:38:11

            • Partager sur Facebook
            • Partager sur Twitter

            Mon site web de jeux SDL2 entre autres : https://www.ant01.fr

            Surcharge de constructeur qui fonctionne pas

            × 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