IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SL & STL C++ Discussion :

[STL]Problème itérateur avec list


Sujet :

SL & STL C++

  1. #1
    Membre éprouvé

    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 634
    Points : 1 205
    Points
    1 205
    Par défaut [STL]Problème itérateur avec list
    Hello,

    Je débute avec les conteneurs et mon compilateur me met une floppée d'erreurs dans cette fonction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    // Dessine la liste des briques
    void DrawBricks(SDL_Surface* MainScreen)
    {
    	list<CBrick*>::iterator i;
    	for(i = m_brickList.begin(); i != m_brickList.end(); i++)
    	{
    		SDL_FillRect(MainScreen, i->m_Position, i->m_Color);
    	}
    }
    La liste est déclarée comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    list <CBrick*> m_brickList;
    Et pourtant j'ai aussi un code avec itérateur pour détruire les objets et là il n'y a pas d'erreurs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    CLevel::~CLevel()
    {
    	// Destruction de la liste
    	list<CBrick*>::iterator i;
    	for(i = m_brickList.begin(); i != m_brickList.end(); i++)
    	{
    		delete *i;
    		cout << "Brique effacée de la mémoire" << endl;
    	}
     
    	m_brickList.erase(m_brickList.begin(), m_brickList.end() );
    }
    Ce n'est pas comme ça qu'on utilise l'itérateur? Je n'ai pas trouvé d'exemple similaire dans la FAQ ou ailleurs...

  2. #2
    Membre émérite
    Avatar de la drogue c'est mal
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    2 253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 2 253
    Points : 2 747
    Points
    2 747
    Par défaut
    c'est quoi les erreurs ?

  3. #3
    Membre éprouvé

    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 634
    Points : 1 205
    Points
    1 205
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    f:\documents and settings\jérémy.jeremy-portable\mes documents\visual studio projects\pong\level.h(49): error C2227: la partie gauche de '->m_Position' doit pointer vers un class/struct/union
    f:\documents and settings\jérémy.jeremy-portable\mes documents\visual studio projects\pong\level.h(49): error C2839: type de retour 'std::list<_Ty>::_Tptr' non valide pour l'opérateur surchargé 'operator ->'
            with
            [
                _Ty=CBrick *
            ]
    f:\documents and settings\jérémy.jeremy-portable\mes documents\visual studio projects\pong\level.h(49): error C2227: la partie gauche de '->m_Position' doit pointer vers un class/struct/union
    f:\documents and settings\jérémy.jeremy-portable\mes documents\visual studio projects\pong\level.h(49): error C2839: type de retour 'std::list<_Ty>::_Tptr' non valide pour l'opérateur surchargé 'operator ->'
            with
            [
                _Ty=CBrick *
            ]
    f:\documents and settings\jérémy.jeremy-portable\mes documents\visual studio projects\pong\level.h(49): error C2227: la partie gauche de '->m_Color' doit pointer vers un class/struct/union
    f:\documents and settings\jérémy.jeremy-portable\mes documents\visual studio projects\pong\level.h(49): error C2839: type de retour 'std::list<_Ty>::_Tptr' non valide pour l'opérateur surchargé 'operator ->'
            with
            [
                _Ty=CBrick *
            ]
    f:\documents and settings\jérémy.jeremy-portable\mes documents\visual studio projects\pong\level.h(49): error C2839: type de retour 'std::list<_Ty>::_Tptr' non valide pour l'opérateur surchargé 'operator ->'
            with
            [
                _Ty=CBrick *
            ]
    f:\documents and settings\jérémy.jeremy-portable\mes documents\visual studio projects\pong\level.h(49): error C2227: la partie gauche de '->m_Color' doit pointer vers un class/struct/union
    En gros que l'itérateur est faux je pense... il n'arrive pas à accéder à mon objet qui pourtant doit marcher...

  4. #4
    Membre émérite
    Avatar de la drogue c'est mal
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    2 253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 2 253
    Points : 2 747
    Points
    2 747
    Par défaut
    essai ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    void DrawBricks(SDL_Surface* MainScreen) 
    { 
       list<CBrick*>::iterator i; 
       for(i = m_brickList.begin(); i != m_brickList.end(); i++) 
       { 
          SDL_FillRect(MainScreen, (*i)->m_Position, (*i)->m_Color); 
       } 
    }

  5. #5
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for(i = m_brickList.begin(); i != m_brickList.end(); i++)
       {
          SDL_FillRect(MainScreen, (*i)->m_Position, (*i)->m_Color);
       }

  6. #6
    Membre éprouvé

    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 634
    Points : 1 205
    Points
    1 205
    Par défaut
    Ah d'accord merci je n'avais plus pensé qu'il fallait deréférencer 2 fois l'itérateur le genre de truc trop con...

    Mais au fait y'a-t-il un sens de déclarer une liste de pointeurs si on y accède comme ceci? Quand l'objet est il copié?

  7. #7
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    L'intérêt de stocker des pointeurs est justement qu'il n'y a aucune copie. Après à toi de voir si c'est cohérent avec tes classes et leur sémantique.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    Points : 473
    Points
    473
    Par défaut
    Pour la frime, sans boucles du tout:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    namespace 
    {
      /** Dessine une seule brique */
      void DrawBrick(CBrick * brick, SDL_Surface * scr)
      {
        SDL_FillRect(scr, i->m_Position, i->m_Color); 
      }
     
      /** Detruit l'objet pointé */
      struct DeleteObject
      {
        template<typename T>
        void operator()(const T* ptr) const
        {
          delete ptr;
        }
      };
    }
     
    void 
    CLevel::DrawBricks(SDL_Surface * MainScreen)
    {
      for_each(m_brickList.begin(), m_brickList.end(),
               bind2nd(ptr_fun(DrawBrick), MainScreen));
    }
     
    void
    CLevel::~CLevel()
    {
      for_each(m_brickList.begin(), m_brickList.end(),
               DeleteObject());
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème combo avec liste
    Par RomJo dans le forum Struts 2
    Réponses: 9
    Dernier message: 19/01/2011, 14h19
  2. Problème avec <list> itérateur
    Par yanchasp dans le forum C++
    Réponses: 11
    Dernier message: 06/06/2007, 20h07
  3. STL Problème avec une liste d'instances de class
    Par BruceBoc dans le forum SL & STL
    Réponses: 12
    Dernier message: 16/02/2007, 15h12
  4. Problème avec listes liées entre elles et bouton "précé
    Par Oluha dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 02/08/2005, 16h10
  5. conteneur de la STL (problème avec DLL et COM)
    Par moldavi dans le forum MFC
    Réponses: 8
    Dernier message: 25/07/2005, 23h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo