矢量打印重复值

时间:2018-03-31 17:01:31

标签: c++

我用C ++编写了一个程序来打印出一个指向我的类的指针向量VehicleCar的父类。 所有函数都正常工作,但程序本身会打印错误的值,在循环的所有迭代后更改它们。 这是代码:

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

1 个答案:

答案 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/),它将为您释放内存:)