Partage
  • Partager sur Facebook
  • Partager sur Twitter

Polymorphisme: vecteur contenant différents objets

    20 novembre 2017 à 17:57:56

    Bonjour à tous,

    je souhaite creer un vecteur contenant différents objets ayant tous des attributs differents. Je dois dans la suite de mon code recuperer la valeur des attributs des differents objets à partir de ce vecteur ! ce que je n'arrive pas à faire pour l'instant !

    class Carte{}
    
        class Creature: public Carte
        {
        //avec des attributs comme m_degat1
        };
        class Monstre: public Carte
        {
            //avec d'autres atttributs comme m_mochete1
        };
    
        vector <Carte*> test;
    
        Creature *t1;                  //Je crée un pointeur du type de mon vecteur
        t1=new Creature();          //je le "popinte sur un type créature
        t1->Setm_degat1(20);        //Je set ses degats à 20
        test.push_back(t1);        //Je l'ajoute à mon vecteur test
        cout<<test[0]->Getm_degat1();  //Je tente d'afficher les degats de ma creatues rentrée precedemment



    Le message d'erreur est toujours le même : "Class Carte* n'a pas d'attribut m_degat1" or je voudrai s que cette "case du vecteur devienne un type Creature.

    -
    Edité par AxelSani 20 novembre 2017 à 18:04:30

    • Partager sur Facebook
    • Partager sur Twitter
      20 novembre 2017 à 18:25:57

      Salut AxelSani,

      Je pense que ton probléme vient du fais que tu initialises ton pointeur de type <vector> dans ta classe Carte elle même. Essaye de déclarer tous cela dans ta fonction main(). Sinon essaye d'utiliser le poiteur this pour retourner ta  classe elle même. Et je ne crois pas qu'il soit possible de déclarrer des classes dans une classes.

      Il est possible que je me trompe !!:lol:

      • Partager sur Facebook
      • Partager sur Twitter

      Galérer est le succés de la réussite ;')

        20 novembre 2017 à 18:30:21

        Vous utilisez le type std::vector, et c'est bien, mais tout le reste sent les âneries qu'enseigne le cours calamiteux du C++ du cite OCR.

        Utilisez des std::unique_ptr à la place des pointeurs nus tous pourris.

        Vous ne devriez mettre dans un "std::vector<std::unique_ptr<Carte>>" que des cartes et des objets dérivés de Cartes.

        Mais, une fois dans cette liste, vous devez faire le deuil des spécificités de chaque classe fille de carte.

        Pourquoi une carte n'aurait-elle pas de dégâts ???

        class Carte{
            int degat_;
            int defense_;
        public :
            Carte(int degat = 0; defense = 0):degat_{degat},defense_{defense}{}
            int getDebat() const {return degat_;};
        }
         
        class Creature: public Carte
        {
        public:
            Creature(int degat):Carte{degat}{}
        };
        
        class Monstre: public Carte
        {
            //avec d'autres atttributs comme m_mochete1
        };
        ----
        
         
            std::vector<unique_ptr<Carte>> test;
         
            test.push_back(std::make_unique<Creature>(20));
        
            cout<<test[0]->getDegat();



        • Partager sur Facebook
        • Partager sur Twitter
        Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
          20 novembre 2017 à 22:55:53

          En plus de ce que dit bacelar, un petit scénario d'usage montre les limites de cette approche. Je mets des Creature, des Monstre et tout un tas d'autre cartes dans mon vector, puis pour mettre un peu de piment dans la partie, je mélange mon vector... Maintenant je prends la première carte du vector. Quel est le type réel de cette carte, est ce un Creature? est ce un Monstre? autre chose? Impossible de le savoir puisque j'ai tout mélangé (dans un jeu de carte physique, j'ai battu le jeu). On voit à travers cet expérience de pensée, qu'ici on n'a plus accès au type réel, seulement au type de base (un peu comme si j'avais tiré une carte sans la regarder, je sais que c'est une carte, mais pas de quelle carte il s'agit), donc seuls les services du type de base sont accessibles. Ton modèle se heurte à ce mur, tu n'as accès qu'à ce qui est exposé par la classe de base. Bien sur tu pourrais ajouter une fonction membre virtuelle à Carte pour accéder à m_mochete, au premier abord, cela pourrait sembler simple. Grossière erreur, la classe Creature n'ayant pas d'attribut m_mochete, cette fonction n'aurait aucun sens si elle est appelée sur un Creature, et plus tu vas avoir de type de cartes, plus tu vas devoir ajouter des fonctions de ce genre qui n'auront un sens que pour un petit nombre de type de carte, résultat, tu vas te retrouver avec une classe Carte avec des dizaines de fonctions qui ne servent presque à rien mais que tu es obligés d'avoir pour que ton château de cartes ne s'écroule pas, ça va très vite devenir ingérable.
          • 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

          Polymorphisme: vecteur contenant différents objets

          × 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