Partage
  • Partager sur Facebook
  • Partager sur Twitter

que signifie "initialiser un objet"

dans une classe ?

    30 juillet 2020 à 10:40:13

    Bonjour,

    Pour m'entraîner à manipuler classes, héritage, polymorphisme et consort, je me suis donné un exercice : Faire un simulateur de combats Pokemon type Showdown (de très loin, c'est grandement simplifié !). Ce qui me pose problème, c'est une collection hétérogène d'attaques.

    Les Pokemon sont représentés par des objets (une classe par espèce) qui héritent de la classe "Pokemon" qui contient toutes les statistiques et les méthodes nécessaires pour ce mettre sur la tronche, et je m'épargne les accesseurs. Les attaques sont aussi des objets, avec une classe par attaque, toutes héritées d'une classe "Move". Cela permet 2 choses : j'ai le même formalisme pour les attributs de toutes les attaques et je peux y accéder sans accesseurs (via une fonction ami dans la classe "Pokemon") et surtout, je peux en les mettre dans des collections hétérogène de "Move", "a_learnedMoves", qui est un attribut de la classe "Pokemon".

    Si j'ai bien compris ce que j'apprend depuis 4-5 jours, les vecteurs (utilisés pour faire une collection hétérogène) sont des objets ? Or je n'ai pas à "initialiser" un objet, je n'ai pas besoin de le mentionner dans le constructeur (à moins d'avoir besoin d'un constructeur de cet objet qui n'est pas celui par défaut) ?

    Alors pourquoi mon IDE me prend la tête à me demander d'initialiser ce vecteur ? je le cite : "La variable 'Pokemon::a_learnedMoves' n'est pas initialisée. Initialisez toujours une variable membre (type.6)."

    Ce n'est pas une erreur, mais un "avertissement", ça compile sans problème, mais je veux savoir ce que ça fait là. Ce qui me choque le plus, c'est que cette classe à 2 collections hétérogènes comme attributs, "a_learnedMoves" (les attaques apprises, qui peuvent être utilisées pendant un combat) et "a_learnableMoves" (les attaques que le Pokemon Peut apprendre, utile pour empêcher Carapuce d'utiliser Lance-Flamme), mais "a_learnableMoves" ne donne pas lieu à cet avertissement ! Ce n'est pas dû à l'ordre de définition, puisque "a_learnableMoves" est définit avant "a_learnedMoves" dans la déclaration de classe du *.h

    Je pose ça là car ça a son importance je crois : Je travail avec Visual Studio 2019, donc avec IntelliSense. la liste d'erreur est séparée en 2 catégories : les messages de build d'une part, et les messages d'IntelliSense d'autre part. Ce message d'avertissement est donné par IntelliSense, et pas par le débogueur "normal". Alors est-ce moi qui ai mal compris mon cours, et qui doit initialiser mon vecteur (Je ne sais pas comment du coup) ou bien est-ce un bug d'IntelliSense, qui va probablement se faire corriger dans une mise à jour ?

    • Partager sur Facebook
    • Partager sur Twitter
      30 juillet 2020 à 16:01:09

      PCMRF a écrit:

      Si j'ai bien compris ce que j'apprend depuis 4-5 jours ...

      Où est-ce que tu apprends ?
      Si c'est sur openclassroom, part tous de suite de ce piège, un recherche sur le forum t'expliquera pourquoi.

      Concernant le message du compilateur, il t'indique que ta variable contiendra n'importe quoi, et que son utilisation peut poser problème.
      Sinon, un extrait de ton code source nous sera utile.

      PS: std::vector est un conteneur permettant de stocker des objets de même type de façon contigües, je ne sais pas où tu as vu qu'ils pouvaient être hétérogènes.

      -
      Edité par Deedolith 30 juillet 2020 à 16:03:38

      • Partager sur Facebook
      • Partager sur Twitter
        30 juillet 2020 à 16:18:50

        Bonjour,

        Tous les objets sont construits et sont donc forcément toujours initialisés. Les seules exceptions sont les scalaires (ou des structures ou tableaux composées de scalaires) qui peuvent parfois ne pas être initialisés.
        Le std::vector<> n'en fait pas partie donc un std::vector<> est forcément initialisé.
        Peux-tu nous indiquer la ligne où tu déclares ton vecteur?

        Et attention un std::vector<> ça définit un tableau d'objets homogènes. Pour des entités hétérogènes, il y a les classes et les std::tupple<>. Pour référencer des entités polymorphiques, on peut utiliser des références ou des pointeurs ; C'est vraisemblablement ton besoin ici.

        • Partager sur Facebook
        • Partager sur Twitter

        En recherche d'emploi.

          30 juillet 2020 à 19:42:36

          Oui, depuis 4-5 jours sur ce site... ça ne peut pas être si mauvais que ça, si ? pourquoi laisser ce cours alors ? :(

          Très bien, je vais mettre le code, enfin ce n'est pas complet, car il y a beaucoup de variables et méthodes inutiles ici. Je vais m'efforcé d'afficher cela de la manière la plus concise possible.

          Fichier "Pokemons.h" - Contient la déclaration des classes "Pokemon" (mère) et des classes liées au différentes espèces (filles)

          #ifndef DEF_POKEMON
          #define DEF_POKEMON
          
          #include <vector>
          
          #include "Moves.h"
          
          
          
          class Pokemon {
          protected:
          	int a_maxHP, a_Atk, a_Def, a_SpA, a_SpD, a_Spe;
          	std::vector <Move*> a_learnableMoves;
          	std::vector <Move*> a_learnedMoves;
          
          	//... Other stats...
          
          public:
          	Pokemon();
                  //... Other methods
          };
          
          
          //other Pokemon, only Squirtle and Charmander 

          Lignes 13, et 14 (si j'ai bien compté), j'ai essayé de définir des collections hétérogènes (comme expliqué dans cette section : c'est le chapitre Polymorphisme, et j'ai bien un vecteur de pointeurs vers des "Move", pour rebondir sur @Dalfab) d'adresses d'objets de type "Move", en effet, par héritage (comme expliqué dans ce cours, mais j'ai l'impression que je ne doit pas croire tout ce que j'y lit, d'après @Deedolith), les différentes attaques sont des objet de type "Move".

          Fichier "Moves.h" - Celui-ci contient la déclaration de la classe "Move" (mère) et des classes correspondants aux attaques (filles), je ne copie que la première pour montrer comment j'ai fait, les autres ont la même construction.

          #ifndef DEF_MOVES
          #define DEF_MOVES
          
          #include <string>
          
          class Move {
          protected:
          	int a_basePower;
          	int a_precision; // %
          	int a_PP;
          	int a_currentPP;
          	std::string a_name;
          	int a_category; //1 for physical, 2 for special, 3 for status
          	
          public:
          	Move();
          };
          
          //Fire Moves//
          class Ember : public Move {
          public:
          	Ember();
          };
          
          //9 other moves
          #endif

          Comme je l'ai expliqué plus tôt (je répète juste en dessous du code pour regrouper les informations) j'ai procédé comme ça pour car 2 attaques ont des attributs distincts, qui sont initialisés différemment grâce au constructeur de chaque attaque. De plus ça me permet de toutes les traiter comme des "Move" et donc de les mettre dans des collections hétérogènes. (cf plus haut)

          Voilà, je vous épargne les constructeurs, rien de bien intéressant dedans, ce ne sont que des int à mettre à telle ou telle valeur...

          Enfin, je tiens à préciser que, après un redémarrage de l'ordinateur, cette "avertissement" n'apparaît plus ! o.O Du coup je comprends encore moins, car je n'ai pas modifié le code entre temps. :thinking:

          Pour en revenir au cours C++ OpenClassroom, j'ai effectivement lu par-ci par-là sur le forum, pendant mes recherches que le cours n'était pas bon, en particulier, je cite : "Le cours OC est loin, très loin, d'être une référence [...]". Mais je n'ai pas trouvé d'explications, donc j'ai ignoré en me disant que, à mon modeste niveau, ça ne devait pas être impactant. J'ai fait fausse route ? je veux bien qu'on m'explique en quoi il est mauvais, car à vrai dire, j'ai cherché ailleurs, mais jen e trouve pas grand chose d'aussi clair et bien mis en forme (la sacro-sainte lisibilité) que ce cours, je veux dire, le cours de Developpez.net il pique les yeux quand même !

          J'ai bien pensé à acheter un bouquin dédié mais, eh, l'argent !

          • Partager sur Facebook
          • Partager sur Twitter
            30 juillet 2020 à 21:04:23

            PCMRF a écrit:

            Oui, depuis 4-5 jours sur ce site... ça ne peut pas être si mauvais que ça, si ? pourquoi laisser ce cours alors ? :(

            C'est pas nous qui décidons.

            PCMRF a écrit:

            Pour en revenir au cours C++ OpenClassroom, j'ai effectivement lu par-ci par-là sur le forum, pendant mes recherches que le cours n'était pas bon, en particulier, je cite : "Le cours OC est loin, très loin, d'être une référence [...]". Mais je n'ai pas trouvé d'explications, donc j'ai ignoré en me disant que, à mon modeste niveau, ça ne devait pas être impactant. J'ai fait fausse route ? je veux bien qu'on m'explique en quoi il est mauvais, car à vrai dire, j'ai cherché ailleurs, mais jen e trouve pas grand chose d'aussi clair et bien mis en forme (la sacro-sainte lisibilité) que ce cours, je veux dire, le cours de Developpez.net il pique les yeux quand même !

            Tu n'as pas du beaucoup chercher, c'est un sujet qui revient plusieurs fois par semaine. 

            Pour les alternatives, on cite souvent le cours de Zeste de Savoir.

            Et les cours sur developpez.com sont aussi obsoletes.

            Pour tes codes, il y a trop de choses a corriger. Reprends un cours de 0.

            • Partager sur Facebook
            • Partager sur Twitter
              30 juillet 2020 à 21:17:16

              ça casse mon planning. :(

              Enfin pour faire quelque chose de quali, pas le choix. Merci pour la ref, je m'y met demain. :)

              • Partager sur Facebook
              • Partager sur Twitter

              que signifie "initialiser un objet"

              × 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