std::list 上的自动迭代器值不正确

Incorrect values with auto iterator on std::list

我首先初始化了一个旅馆对象,然后初始化了一些房间对象并分别打印了它们的 id(打印正确。)

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

然后,我在列表上进行此迭代:

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

另外,这里是酒店 class 上那些方法的实现:

//header
list<Room*> rooms;

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

然后看看输出!

所有其他部分(如 id 生成和对象构造)都经过测试并且工作正常。

由于您还没有发布 addRoom 函数的定义,根据推论,我得出的结论是它的作用类似于:

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

然后给出以下循环:

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
}

所以最后你的 std::list<Room*> 充满了悬空指针 - 指向不再属于你的内存的指针。这会导致未定义的行为。

我建议您完全放弃指针并更改为:

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;
    }
};