Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème de tableau d'objets

Sujet résolu
    22 juillet 2007 à 16:25:18

    Bonjour, je suis dans le codage d'un jeu style Bomberman et j'ai un petit problème... :D

    J'ai une classe Bombe, pas trop de problème la-dedans, mais c'est dans ma classe de Personnage que ca foire : j'y déclare un tableau d'objets de type Bombe, dans Joueur.h (Perso.h aurait été un meilleur nom mais tant pis ^^) :
    Bombe *m_bombe;

    Puis dans le constructeur de la classe Joueur :
    Joueur::Joueur()
    {
        m_bombesMax = 5;
        m_sens = HAUT;

    m_bombe = new Bombe[5];
    }


    Jusque la tout va encore bien... mais les problèmes arrivent quand je veux faire appel à une méthode d'une des bombes du perso et supprimer une des Bombes du tableau :
    if (m_bombe[i]->explose)
                    delete m_bombe[i]  ;

    Ici, CodeBlocks m'indique une erreur à la première ligne : 'base operand of '->' has non-pointer type 'Bombe''

    Et à la deuxième ligne : 'type 'class Bombe' argument given to 'delete', expected pointer'

    Je pense que la deuxième vient du fait que le tableau de Bombes ayant été alloué dynamiquement je ne peux pas faire de delete sur chaque objet Bombe mais uniquement sur tout le tableau...

    Voila au cas ou les implémentations des methodes de la classe Bombe :

    Bombe::Bombe() {}

    Bombe::Bombe(SDL_Rect position, int carte[][11], int tempsActuel)
    {

    m_position.x =position.x;
    m_position.y =position.y;

    carte[m_position.x][m_position.y] = 'B';

    int m_tempsPose = int tempsActuel;
    }

    Bombe::~Bombe() {}

    bool Bombe::explose (int tempsActuel)
    {
        if (tempsActuel - m_tempsPose >= 1500)
        return true;
        else
        return false;
    }


    Merci d'avance d'éclairer ma lanterne :euh:
    • Partager sur Facebook
    • Partager sur Twitter
      22 juillet 2007 à 16:44:58

      Je ne crois pas que tu puisse suprimer un des éléments du tableau comme ça et puis, quand on y pense, "m_bombe[i]", n'est pas un pointeur donc faire "delete m_bombe[i]" est impossible.
      Si tu veut pouvoir suprimer un élément particulier d'une liste d'élément, l'idéal est d'utiliser les listes chainées (en plus c'est sympa à utiliser en c++).
      • Partager sur Facebook
      • Partager sur Twitter
        22 juillet 2007 à 16:50:03

        Je vais voir les listes chaînées, j'ai jamais lu le tuto... sinon, étant donné que la pose de la bombe et tout ce qui la concerne se fait dans le constructeur surchargé de la classe Bombe, j'avais pensé à simplement remplacer une bombe qui explose par une bombe créée à partir d'un constructeur par defaut qui ne la place pas (le même que celui qui est appelé quand je fais m_bombe = new Bombe[5];

        Mais mon plus gros problème reste celui de la première erreur qui m'empeche d'acceder correctement aux méthodes de la classe :s
        • Partager sur Facebook
        • Partager sur Twitter
          22 juillet 2007 à 16:54:04

          Attend le tuto sur les listes chainées de ce site est pour le C, tu peut faire beaucoup mieux en C++, je vais t'en trouver un autre.
          EDIT: voila http://c.developpez.com/tutcpp/x8489.php
          • Partager sur Facebook
          • Partager sur Twitter
            22 juillet 2007 à 17:12:35

            Tu pourrais utitliser les conteneurs de la STL.
            • Partager sur Facebook
            • Partager sur Twitter
              22 juillet 2007 à 18:53:31

              magnanime -> c'est justement là dessus qu'est la page de mon lien, faute de ne pas trouver un tuto sur la création d'une liste en C++.
              • Partager sur Facebook
              • Partager sur Twitter
                23 juillet 2007 à 11:57:42

                Ba ouais, m_bombe[i] désigne un objet de type Bombe, ce n'est pas une adresse ! Dans ce cas, tu ne dois pas faire m_bombe[i]->methode() mais m_bombe[i].methode(). pareil pour le delete, ou t'as vu qu'on supprimais de mémoire une case choisie d'un tableau ? Soit tu delete tout le tableau, soit tu delete rien du tout. C'est pas grave qu'elle soit pas deletée, tu pourras toujours la remplacer par une nouvelle bombe.

                Ou alors mieux, tu fais un tableau de pointeurs de bombes ! Je sais pas si ça se fait avec "new" mais avec "malloc" c'est possible. Donc en considérant que ça marche pareil, tu pourrais faire
                Bombe *m_bombe = new *Bombe[5];

                Dans ce cas, pour vérifier qu'une bombe explose, ça serait m_bombe[i]->explose(). Pour changer de bombe, tu n'aurais qu'à faire pointer la case du tableau correspondant vers une nouvelle bombe.

                Attention je suis encore un débutant alors il y a peut-être beaucoup de faux dans ce que je dis, à contrôler donc.
                • Partager sur Facebook
                • Partager sur Twitter
                  23 juillet 2007 à 12:34:16

                  Oui ca se fait avec new.

                  en C++ pas de malloc puisque new fait la même chose en mieux
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
                    23 juillet 2007 à 13:22:21

                    Oui en effet après quelques changements en remplacant le '->' par '.' ca marche... J'ai encore un ptit bug à voir mais je note résolu pour le moment.

                    Merci à tous :p
                    • Partager sur Facebook
                    • Partager sur Twitter

                    Problème de 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