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;
}
};
我首先初始化了一个旅馆对象,然后初始化了一些房间对象并分别打印了它们的 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;
}
};