Partage
  • Partager sur Facebook
  • Partager sur Twitter

[C++] Allocation dynamique d'un tableau de class à double entrée

    10 août 2006 à 18:18:08

    Bonjour bonjour.

    J'ai un petit problème qui me triture l'esprit, et que je n'arrive pas à résoudre.

    Comment allouer dynamiquement un tableau à double entrée ?
    J'ai trouvé la réponse ici.

    Mais voilà, moi je veux créer un tableau à double entrée contenant des instanciations de classe.

    C'est pour une map carrée, de dimensions définies, je voudrais instancier la classe pour chaque case, pour pouvoir stocker des info sur chaque case (type, traversable ou non...). Mais voilà, ça ne fonctionne pas. Voilà comment j'ai procédé :

    Tile.h


    /*

    Tile.h
    ----------
    Class gérant une case de la map.

    */


    #ifndef TILE_H
    #define TILE_H

    class Tile
    {

    protected:
        int _coordX, _coordY;


    public:
        Tile(int x, int y);

    };

    #endif

    /* Toujours un saut de ligne */



    Tile.cpp


    /*

    Tile.cpp
    ----------
    Méthodes de la class Tile gérant une case de la map.

    */


    //'include.h' inclus 'Tile.h'
    #include "include.h"

    Tile::Tile(int x, int y)
    {

       _coordX = x;
       _coordY = y;

    }

    /* Toujours un saut de ligne */



    Mon main, seulement la partie où je cherche à instancier la class.

    (dans un tableau à double entrée de 30*30 par exemple)
    //** comme c'est un tableau à double entrée
    class Tile **tile = NULL;

    int i, j;

    //allocation de la 1ere dim de 30 cases
    tile = (Tile**)malloc( sizeof(class Tile*) * 30);

    //on parcours chaque cases de la 1ere dim
    for (i = 0; i < 30; i++)
    {

        //allocation de la 2eme dim de 30 cases aussi
        tile[i] = (Tile*)malloc( sizeof(class Tile) * 30);

        //on parcours la 2eme dim pour instancier la class
        for (j = 0; j < 30; j++)
            tile[i][j] = new Tile(i, j); //ligne de l'erreur

    }


    Voilà comment je procède, mais le compilateur me sort une erreur que j'ai du mal à comprendre...

    Citation : Code::Blocks

    main.cpp:41: error: no match for 'operator=' in '*((*((+(((unsigned int)i) * 4u)) + tile)) + (+(((unsigned int)j) * 8u))) = (((Tile*)operator new(8u)), (<anonymous>->Tile::Tile(i, j), <anonymous>))'
    Tile.h:13: note: candidates are: Tile& Tile::operator=(const Tile&)



    Voilà, l'erreur fait 3km, et j'ai du mal à la comprendre. Ca doit être une histoire de surcharge ('operator='), mais pourquoi ? Je ne cherche rien de tel ici...

    Au fait, j'ai été obligé de transtyper avant de faire le malloc, sinon il me mettai un erreur 'invalid conversion from (void*) to (Tile**).

    Enfin, j'espers que vous savez ce qui ne va pas ! Merci !
    • Partager sur Facebook
    • Partager sur Twitter
      10 août 2006 à 19:18:17

      recherche un peut quelqun avait repondu a un truc comm sa plus bas...sauf que la tu peut pas faire new a ton til a ce que je comprend...sinon tile[i] = (Tile*)malloc( sizeof(class Tile) * 30); se serait pas tile[i][j] = (Tile*)malloc( sizeof(class Tile) * 30); plutot?
      • Partager sur Facebook
      • Partager sur Twitter
        10 août 2006 à 19:33:43

        tile[i][j] contient un Tile, tu lui assigne un Tile* (new).

        Tu n'est pas obligé d'utiliser class lors du malloc.
        tile = (Tile**)malloc( sizeof(Tile*) * 30 );

        ça fonctionne aussi, tu devrais tant qu'a faire du C++ utiliser new.
        tile = new Tile*[30];
        • Partager sur Facebook
        • Partager sur Twitter
          10 août 2006 à 20:05:26

          Utilise new[], vas faire un tour sur la faq c++ de www.developpez.com .
          • Partager sur Facebook
          • Partager sur Twitter
            10 août 2006 à 21:18:10

            Le truc, c'est de faire un tableau à une dimension et d'utiliser la formule classique :
            Tile& Map::GetTile(int x, int y)
            {
                return m_Tiles[y*m_iWidth + x);
            }


            Sinon, il faut faire une classe Map pour contenir les tiles au lieu d'un bête tableau, plus pratique, et stocker les coordonnées dans la classe Tile n'a aucun intérêt et relève sans doute d'une erreur.
            • Partager sur Facebook
            • Partager sur Twitter
              11 août 2006 à 0:32:58

              Merci beaucoup à vous 4, j'ai résolu mon problème !

              Au fait, je ne savai pas me servir de new pour allouer un tableau (j'avai pas assez regardé...). C'est pour ça que j'esseyai avec malloc().

              Maintenant, j'ai réussi avec new. J'ai aussi utilisé la méthode de remram44, utiliser un tableau à 1 seule dimension, car c'est facile de retrouver chaque case quand même.

              Sinon, pour ce qui est des coordonées des tiles dans la class Tile, au fait je les avai mis car comme je n'arrivai pas a créer la class dans la class Map, je l'ai fais dans le main, et je voulais donc stocker les coordonées. Maintenant, jai réussi à le faire dans Map, et je n'ai plus besoin de ces coordonées.

              Merci beaucoup !
              • Partager sur Facebook
              • Partager sur Twitter

              [C++] Allocation dynamique d'un tableau de class à double entrée

              × 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