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

Langage C++ Discussion :

Problème avec l'utilisation d'une list versus un vector


Sujet :

Langage C++

  1. #1
    Membre éclairé Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Points : 862
    Points
    862
    Par défaut Problème avec l'utilisation d'une list versus un vector
    Bonjour,


    J'utilise un code qui fait appel à une liste d'objets "Route" déclarée comme donnée membre privée de la classe RouteFactory:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    list <Route> listRoute;
    et un vecteur d'objets "Route*" déclarée comme donnée membre privée aussi dans cette même classe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vector <Route*> pRoute;
    La classe Route contient entre-autres la méthode suivante:
    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
     
    Status Route::getCurrentStatus(void)
    {
      Status lastStatus;
     
      switch(m_curStatus)
      {
        case stop :
          cout << "Route::getCurrentStatus: STOP status" << endl;
          lastStatus = STATUS_VALUE_STOPPED;
          break;
     
        case start :
          cout << "Route::getCurrentStatus: START status" << endl;
          lastStatus = STATUS_VALUE_STARTED;
          break;
     
        case complete :
          cout << "Route::getCurrentStatus: COMPLETE status" << endl;
          lastStatus = STATUS_VALUE_COMPLETED;
          break;
     
        default :
          cout << "Route::getCurrentStatus: DEFAULT status" << endl;
          lastStatus = STATUS_VALUE_STOPPED;
          break;
      }
     
      cout << "Route::getCurrentStatus: Play status is: " << lastStatus << endl;
     
      return lastStatus 
    }
    Ces 2 données membres sont mis à jour lors de la création d'une instance "Route" dans la classe RouteFactory de cette manière:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Route *route = new Route();
    if(route)
    {
        listRoute.push_back(*route);
        pRoute.push_back(route);
    }
    Dans la classe RouteFactory, j'ai la méthode suivante qui utilise nos données membres:
    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
     
    void RouteFactory::listRoute()
    {
      for (std::list <Route>::iterator it = listRoute.begin() ; it != listRoute.end(); it++)
      {    
          cout << "RouteFactory::listRoute: Status with iterator is: " << it->getCurrentStatus() << endl; 
      }
     
      cout << endl;
     
      for(unsigned int i = 0; i < pRoute.size(); ++i)
      {
          Route *p = pRoute.at(i);
          cout << "RouteFactory::listRoute: Status with vector of pointer is: " << p->getCurrentStatus() << endl; 
      }
    }
    J'obtiens les traces suivantes:
    Route::getCurrentStatus: STOP status
    Route::getCurrentStatus: Play status is: 2
    RouteFactory::listRoute: Play status with iterator is: 2
    Route::getCurrentStatus: STOP status
    Route::getCurrentStatus:: Play status is: 2
    RouteFactory::listRoute: Play status with iterator is: 2

    Route::getCurrentStatus:: STOP status
    Route::getCurrentStatus:: Play status is: 2
    RouteFactory::listRoute: Play status with vector of pointer is: 2

    Route::getCurrentStatus:: START status
    Route::getCurrentStatus:: Play status is: 0
    RouteFactory::listRoute: Play status with vector of pointer is: 0
    Le résultat attendu lors du test en question est d'obtenir 0 pour la deuxième instance parcouru.
    J'aurais pensé que ces deux codes fournirait le même résultat.

    Ma question est pourquoi avec l'utilisation de la liste d'objets listRoute, je récupère 2 au lieu de 0?


    Merci d'avance.

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Je pense que tu as une erreur ligne 11 de ton dernier bout de code.

  3. #3
    Membre éclairé Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Points : 862
    Points
    862
    Par défaut
    Citation Envoyé par oodini Voir le message
    Je pense que tu as une erreur ligne 11 de ton dernier bout de code.
    En fait, c'est moi qui ai modifié à la main avant de poster j'aurais pas dû...

    J'ai corrigé l'erreur < au lieu de <= et remis le résultat initialement obtenu. Sorry.

    Le résultat obtenu avec le vector est celui escompté. Par contre, il devrait y avoir 2 instances, comme je n'ai plus le code sous la main, faudra que je re-vérifie.

    Sur le l'utilisation de la list, m'y prends je bien de la bonne manière?

  4. #4
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Dans la liste, tu stocke des objets. Dans le vecteur, tu stocke des pointeurs. Si tu modifie l'état de pRoute[0], celui de l'objet stocké dans la liste n'est pas modifié. Du coup, il n'y a aucune raison pour avoir la même chose en status.

    Petite information : l'opérateur new ne peux pas échouer - s'il échoue, une exception est générée. Du coup, tu n'as pas besoin de tester si route est non nul - c'est garanti par la norme.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  5. #5
    Membre éclairé Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Points : 862
    Points
    862
    Par défaut
    Citation Envoyé par Emmanuel Deloget
    Dans la liste, tu stocke des objets. Dans le vecteur, tu stocke des pointeurs. Si tu modifie l'état de pRoute[0], celui de l'objet stocké dans la liste n'est pas modifié. Du coup, il n'y a aucune raison pour avoir la même chose en status.
    Ah oui. En fait dans la liste c'est une copie de l'objet...

    Citation Envoyé par Emmanuel Deloget
    Petite information : l'opérateur new ne peux pas échouer - s'il échoue, une exception est générée. Du coup, tu n'as pas besoin de tester si route est non nul - c'est garanti par la norme.
    D'accord, merci pour l'information. Réflexe de C! ;-)

    Finalement, je vais modifier le code pour l'adapter à une liste du type:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    list <Route*> listRoute_p;

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

Discussions similaires

  1. Problème avec l'utilisation d'une classe
    Par yoshik dans le forum Général Python
    Réponses: 23
    Dernier message: 29/04/2011, 13h36
  2. Réponses: 4
    Dernier message: 19/07/2009, 13h51
  3. [EJB3 Entity] Problème avec les annotations pour une List d'Enum
    Par uiscias dans le forum Java EE
    Réponses: 2
    Dernier message: 31/03/2009, 17h09
  4. problème avec l'utilisation d'une fonction
    Par mcspawn dans le forum Langage
    Réponses: 6
    Dernier message: 06/06/2007, 15h39
  5. Problème avec un bouton lié à une liste déroulant
    Par valouche dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 01/06/2007, 13h55

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