我有一个包含这些载体的类:
class MainMenu {
private:
std::vector <Car> vehicles;
std::vector <Instructor> instructors;
std::vector <Trainee> trainees;
std::vector <Lesson> lessons;
public:
std::vector<Car>& getVehicles();
std::vector<Instructor>& getInstructors();
std::vector<Trainee>& getTrainees();
std::vector<Lesson>& getLesson();
}
// --------------------------------------------- ----
class Car : public Vehicle {
public:
static MARKA convertStringToMarka(std::string name);
Car(std::string numberPlate, MARKA marka, bool roadWorthy);
Car() {};
Car(int id,std::string numberPlate, MARKA marka, bool roadWorthy);
};
在代码的某处我执行了这样的功能:
Car *car = mainMenu.searchForCarById(idOfVehicle);
Car* MainMenu::searchForCarById(int id) {
for (Car elem : vehicles) {
if (elem.getIdInSystem() == id) {
return &elem;
}
}
}
在调试时我逐步执行此代码,这只是正确搜索汽车的功能,但每当我从功能返回时,每个变量都是字符串消失。例如,在name
变量中,我收到""
。我认为重要的是要提到只有字符串消失! int保持原样。我做错了什么?
答案 0 :(得分:5)
更改此行
for (Car elem : vehicles)
到
for (Car& elem : vehicles)
否则您要保存指向超出范围的局部变量的指针,因此针对dangling pointer
答案 1 :(得分:4)
for (Car elem : vehicles)
elem
是vehicles
中包含的实际对象的副本。然后返回一个指向这个被破坏的本地对象的指针,让它悬空。修复方法是使用Car&
代替。
答案 2 :(得分:4)
当您循环通过车辆时,请执行以下操作:
for (Car elem : vehicles)
制作每个元素的副本并将其存储在elem中。
相反,请尝试通过引用获取元素:
for (Car& elem : vehicles)
然后,你实际上可以得到一个指针。但是,只要修改数组,此指针就可能无效。所以它仍然不是最佳的。