Partage
  • Partager sur Facebook
  • Partager sur Twitter

Tableau d'objets

Anonyme
    29 mars 2008 à 16:38:26

    Bonjour,

    je souhaiterais créer un tableau d'objets. J'ai donc une classe Carte (qui contient un int valeur, et un string couleur), et une classe Paquet (qui contient un tableau de 52 cartes Carte cartes[52] ).
    Mais je n'arrive pas a créer le constructeur de Paquet:

    Voici le code de Paquet.ccp :

    1. #include "Paquet.h"
    2. #include "Carte.h"
    3. Paquet::Paquet()
    4. {
    5.         for (int i = 0; i < 13; ++i)
    6.         {
    7.                 cartes[i] = new Carte(i+1,"coeur");
    8.         }
    9. }
    10. Paquet::~Paquet()
    11. {
    12. }


    Lorsque je lance la compilation, il n'y a pas de problème, mais j'ai une erreur du genre 0x002314653 lorsque je lance le jeu.

    Le main ne contient rien de special :

    1. #include <iostream>
    2. #include "Carte.h"
    3. #include "Paquet.h"
    4. using namespace std;
    5. int main(void)
    6. {
    7.         Paquet paquet;
    8.         cout << "test" << endl;
    9.         return 1;
    10. }


    Je pense que ça vient d'un problème d'allocation mémoire, mais je n'arrive pas à le résoudre.
    Merci de votre aide.

    • Partager sur Facebook
    • Partager sur Twitter
      29 mars 2008 à 16:55:34

      Salut.
      Si tu veux construire tes objets "Carte" avec new, il faut que le tableau soit un tableau de pointeurs, et non un tableau d'objets.
      1. class Paquet
      2. {
      3.        ...
      4.        Carte *cartes[52];
      5.        ...
      6. };

      Et dans ce cas, il faut bien penser à détruire les objets créés :
      1. Paquet::~Paquet()
      2. {
      3.        delete[] cartes;
      4. }


      @+
      Xav'
      • Partager sur Facebook
      • Partager sur Twitter
      Portail français wxWidgets : wxDev.fr | Quelques progs + libs wxWidgets compilées : mywxstuff
        29 mars 2008 à 17:00:05

        Ce delete[] est seulement valable si cartes avait été un "Cartes*" alloué avec new[].
        • Partager sur Facebook
        • Partager sur Twitter
        C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
        Anonyme
          29 mars 2008 à 17:33:48

          Merci, ca a l'air de marcher pour le constructeur.

          Mais maintenant j'ai un problème pour afficher le paquet.
          J'ai la fonction getPaquet() :

          1. void Paquet::getPaquet()
          2. {
          3.     this->cartes[1].getCarte; /*le 1 c'est juste pour tester, je vais faire une boucle*/
          4. }


          mais il me dit : request for member `getCarte' in `((Paquet*)this)->Paquet::cartes[1]', which is of non-class type `Carte*'

          La fonction getCarte() renvoie void et se contente d'afficher la valeur et la couleur de la carte.
          Je comprend que carte[1] n'est pas une carte mais un pointeur sur une carte, mais alors comment faire pour utiliser la fonction getCarte ?
          • Partager sur Facebook
          • Partager sur Twitter
            29 mars 2008 à 17:36:37

            getCarte c'est une fonction et pas un attribut
            • Partager sur Facebook
            • Partager sur Twitter
              29 mars 2008 à 17:43:29

              Pas besoin du this. La bonne solution est:

              cartes[1]->getCarte();
              • Partager sur Facebook
              • Partager sur Twitter
              Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
              Anonyme
                29 mars 2008 à 19:09:56

                Je ne comprend pas pourquoi, mais ca ne fonctionne pas.

                J'ai modifier la fonction getCarte() de facon a ce qu'elle renvoie un string;
                et mon paquet.cpp est :

                1. Paquet::Paquet()
                2. {
                3.         Carte * cartes = new Carte[52];
                4.         for (int i = 0; i < 13; i++)
                5.                 {
                6.                         cartes[i] = Carte(i+1,"coeur");
                7.                         cout << cartes[i].getValeur() <<" de ";
                8.                         cout << cartes[i].getCouleur()<< endl;
                9.                 }
                10. }
                11. Paquet::~Paquet()
                12. {
                13.         delete [] cartes;
                14. }
                15. void Paquet::getPaquet()
                16. {
                17.         cout << cartes[1]->getCarte() << endl;
                18. }


                et j'a encore une erreur de type 0x0025346 a l'execution. Ce qui me parait bizarre, c'est que dans le constructeur j'utilise cartes[i].getValeur() et non cartes[i]->getValeur(), et ca m'affiche bien les cartes.
                • Partager sur Facebook
                • Partager sur Twitter
                  29 mars 2008 à 19:18:21

                  Tu es sûr que l'erreur a pas lieu avant ?

                  Montre nous voir le prototype de la classe.
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
                    29 mars 2008 à 20:34:13

                    je trouve etonnant que le compilateur n'a rien dit:
                    1. Paquet::Paquet()
                    2. {
                    3.         Carte * cartes = new Carte[52];
                    4.         // ...
                    5. }
                    6. Paquet::~Paquet()
                    7. {
                    8.         delete [] cartes; // ici tu desalloue une variable que tu as declaré dans le constructeur
                    9. }
                    10. void Paquet::getPaquet()
                    11. {
                    12.         cout << cartes[1]->getCarte() << endl; // ici tu utilises une variable que tu as declaré dans le constructeur
                    13. }
                    • Partager sur Facebook
                    • Partager sur Twitter
                      30 mars 2008 à 1:11:59

                      À ce que je vois, cartes est une variable locale au constructeur.

                      Je peux voir l'interface de la classe Paquet?
                      • Partager sur Facebook
                      • Partager sur Twitter
                      Anonyme
                        30 mars 2008 à 12:15:18

                        Voila Paquet.h :

                        1. #ifndef PAQUET_H_
                        2. #define PAQUET_H_
                        3. #include "Carte.h"
                        4. class Paquet
                        5. {
                        6. protected:
                        7.         Carte *cartes[52];
                        8. public:
                        9.         Paquet(void);
                        10.         ~Paquet(void);
                        11.         void getPaquet();
                        12. };
                        13. #endif /*PAQUET_H_*/


                        Et Paquet.cpp :

                        1. #include "Paquet.h"
                        2. #include "Carte.h"
                        3. Paquet::Paquet()
                        4. {
                        5.         Carte * cartes = new Carte[52];
                        6.         for (int i = 0; i < 13; i++)
                        7.                 {
                        8.                         cartes[i] = Carte(i+1,"coeur");
                        9.                         cout << cartes[i].getValeur() <<" de ";
                        10.                         cout << cartes[i].getCouleur()<< endl;
                        11.                 }
                        12. }
                        13. Paquet::~Paquet()
                        14. {
                        15.         delete [] cartes;
                        16. }
                        17. void Paquet::getPaquet()
                        18. {
                        19.         cout << cartes[1]->getCarte() << endl;
                        20. }
                        • Partager sur Facebook
                        • Partager sur Twitter
                          30 mars 2008 à 12:22:28

                          Paquet::Paqut()
                          {
                          cartes = new Carte[52]; //PAs de Carte*
                          //...
                          }

                          Tu créais une variable locale au constructeur plutot que d'utiliser l'attribut de la classe.

                          Une meilleure solution serait d'utiliser un std::vector<> plutot que un tableau dynamique "à la C".
                          • Partager sur Facebook
                          • Partager sur Twitter
                          Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
                          Anonyme
                            30 mars 2008 à 12:38:11

                            C'est ce que j'avais fait au debut, mais ca ne fonctionne pas.

                            1. Paquet::Paquet()
                            2. {
                            3.         cartes = new Carte[52];//incompatible types in assignment of `Carte*' to `Carte[52]'
                            4.         for (int i = 0; i < 13; i++)
                            5.                 {
                            6.                         cartes[i] = Carte(i+1,"coeur");
                            7.                 }
                            8. }

                            1. class Paquet
                            2. {
                            3. protected:
                            4.         Carte cartes[52]; //encore plus d'erreurs si je met Carte *cartes[52]
                            • Partager sur Facebook
                            • Partager sur Twitter
                            Anonyme
                              30 mars 2008 à 12:41:40

                              Cartes *cartes; revois p-ê le cours.
                              • Partager sur Facebook
                              • Partager sur Twitter
                              Anonyme
                                30 mars 2008 à 12:52:13

                                Je viens de regarder les vecteurs, et ca fonctionne parfaitement.

                                1. Paquet::Paquet()
                                2. {
                                3.         for (int i = 0; i < 13; i++)
                                4.                 {                      
                                5.                         cartes.push_back (Carte(i+1,"coeur"));
                                6.                 }
                                7.         for (int i = 13; i < 26; i++)
                                8.                 {                      
                                9.                         cartes.push_back (Carte((i)%13+1,"pique"));
                                10.                 }
                                11.         for (int i = 26; i < 39; i++)
                                12.                 {                      
                                13.                         cartes.push_back (Carte((i)%13+1,"carreau"));
                                14.                 }
                                15.         for (int i = 39; i < 52; i++)
                                16.                 {                      
                                17.                         cartes.push_back (Carte((i)%13+1,"trèfle"));
                                18.                 }
                                19. }
                                20. Paquet::~Paquet()
                                21. {
                                22. }
                                23. void Paquet::getPaquet()
                                24. {
                                25.         for (int i = 0; i < 52; ++i) {
                                26.                 cout << cartes[i].getCarte();
                                27.         }
                                28. }


                                Merci de m'avoir suggéré cette solution, je ne connaissais pas.
                                Merci a tout le monde de votre aide.
                                • Partager sur Facebook
                                • Partager sur Twitter

                                Tableau d'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