2017-05-09 1 views
0

J'intialize tout d'abord un objet d'hôtel puis initiliser certains objets de chambre et imprimer leurs de respectivement id (qui impriment correctement.)valeurs incorrectes avec iterator automatique sur std :: liste

for(int j=0;j<5;j++){ 
    Room r(1, 30); 
    hotel.addRoom(r); 
    cout << "Id: " << r.getId() << endl; 
} 

Ensuite, je fais cette itération sur la liste:

cout << "Initialized rooms with Ids: "; 
for(auto iterator : hotel.getRooms()){ 
    cout << iterator->getId() << " "; 
} 
cout << endl; 

aussi, voici la mise en œuvre de ces méthodes, sur la classe Hôtel:

//header 
list<Room*> rooms; 

//source 
list<Room*> & Hotel::getRooms(){ 
    return rooms; 
} 

Et regardez la sortie! Toutes les autres parties (comme la génération d'identifiants et la construction d'objets) sont testées et fonctionnent correctement.

+1

Je suppose addRoom fonctionne comme prévu. Dans ce cas, vous avez la liste std :: des pointeurs qui pendent. – DeiDei

+0

Je suppose que le problème est quelque part dans votre classe de classe. Merci de fournir ce code aussi. –

Répondre

0

Puisque vous ne l'avez pas affiché une définition pour la fonction addRoom, par la puissance de déduction, je conclus qu'il fait quelque chose de similaire à:

void Hotel::addRoom(const Room& room) { 
    rooms.push_back(&room); 
} 

Et puis compte tenu de la boucle suivante:

for(int j=0;j<5;j++) 
{ 
    // This creates a Room object local to each iterator of the loop 
    Room r(1, 30); 
    // This adds the address of this local variable in the list 
    hotel.addRoom(r); 
    cout << "Id: " << r.getId() << endl; 
    // The variable r is destroyed here 
} 

Donc à la fin, votre std::list<Room*> est rempli de pointeurs pendants - pointeurs qui pointent vers la mémoire qui n'est plus la vôtre. Cela provoque un comportement indéfini.

je vous recommande laissez tomber les pointeurs tout à fait et passez à:

class Hotel 
{ 
    std::list<Room> rooms; 

public: 
    void addRoom(const Room& room) { 
     rooms.push_back(room); 
    } 
    std::list<Room>& Hotel::getRooms() { 
     return rooms; 
    } 
    const std::list<Room>& Hotel::getRooms() const { 
     return rooms; 
    } 
}; 
+0

Je me rends compte de ce que vous dites, puisqu'il y a beaucoup de code qui utilise déjà des pointeurs comme celui-ci, je vais changer les parties nécessaires pour les utiliser à nouveau. –