我用C ++编写了一个程序来打印出一个指向我的类的指针向量Vehicle
是Car
的父类。
所有函数都正常工作,但程序本身会打印错误的值,在循环的所有迭代后更改它们。
这是代码:
int main() {
std::vector<Vehicle *> vehs;
for (int i = 0; i < 3; i++) {
std::string Id;
std::cout << "Id: " << std::endl;
getline(std::cin, Id);
std::string Marka;
std::cout << "Marka: " << std::endl;
getline(std::cin, Marka);
double Par;
std::cout << "Parametr: " << std::endl;
std::cin >> Par;
getchar();
Car car(Id, Marka, Par);
vehs.push_back(&car);
std::cout << to_string(vehs.cbegin(), vehs.cend());
}
结果如下:
Id:
A
Marka:
A
Parametr:
1
A : A
Id:
B
Marka:
B
Parametr:
2
B : B
B : B
Id:
C
Marka:
C
Parametr:
3
C : C
C : C
C : C
正如您所看到的,如果我不想要它们,vehs
的内容会发生变化。
to_string
看起来像这样:
std::string to_string (const Vehicle& vehicle){
std::ostringstream oss;
oss << vehicle.getId() << " : "<< vehicle.getBrand();
return oss.str();
}
std::string to_string(std::vector<Vehicle*>::const_iterator vehicles_begin,
std::vector<Vehicle*>::const_iterator vehicles_end){
std::ostringstream oss;
for(auto it = vehicles_begin; it!= vehicles_end; it++ ){
oss << to_string(**it) << std::endl;
}
return oss.str();
}
答案 0 :(得分:1)
问题在于:
Car car(Id, Marka, Par);
vehs.push_back(&car);
您无法存储指向本地对象的指针,因为一旦您离开范围,这些对象就会被销毁(因此每次循环结束时都会被销毁)。
相反,您可以使用动态内存分配,例如:
Car *car = new Car(Id, Marka, Par);
vehs.push_back(car);
当然请不要忘记删除所有对象! 另一方面,如果您愿意,可以使用std :: shared_ptr(http://www.cplusplus.com/reference/memory/shared_ptr/),它将为您释放内存:)