离开功能后丢失一些数据

时间:2018-03-12 18:45:46

标签: c++

我有一个包含这些载体的类:

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保持原样。我做错了什么?

3 个答案:

答案 0 :(得分:5)

更改此行

for (Car elem : vehicles)

for (Car& elem : vehicles)

否则您要保存指向超出范围的局部变量的指针,因此针对dangling pointer

答案 1 :(得分:4)

for (Car elem : vehicles)

elemvehicles中包含的实际对象的副本。然后返回一个指向这个被破坏的本地对象的指针,让它悬空。修复方法是使用Car&代替。

答案 2 :(得分:4)

当您循环通过车辆时,请执行以下操作:

for (Car elem : vehicles)

制作每个元素的副本并将其存储在elem中。

相反,请尝试通过引用获取元素:

for (Car& elem : vehicles)

然后,你实际上可以得到一个指针。但是,只要修改数组,此指针就可能无效。所以它仍然不是最佳的。