向量C ++,获取向量的第二个元素有什么不对

时间:2012-10-26 07:55:07

标签: c++

我有一个代码为

的向量
Vector<Vehicle> list
Vehicle *v1;

我做了以下

string inVehicle;

cout << "Enter Vehicle Type";
cin >> inVehicle;

*v1 = new Vehicle;
v1->setName(inVehicle);

所以我做了另一个代码

cout << v1[0].getName() << endl;

结果还可以,但是如果我添加另一个值,因为我的cin输入车辆类型是一个开关案例,而无限直到用户键5退出程序,它将继续工作。

所以我输入第二个条目,但是当我尝试

cout << v1[1].getName() << endl;

第二条记录,它不起作用。它是空白的,但如果我cout v1.size(),它显示为2

如何正常获取第二个元素记录并正常工作?

2 个答案:

答案 0 :(得分:4)

v1不是一个向量,也不是一个数组,而只是一个已经分配给单个对象的指针。因此v1[1]不是有效的对象。

如果你想使用矢量,你根本不应该使用new。 (这是矢量,而不是矢量)

std::vector<Vehicle> list;
list.push_back( Vehicle() );
list.back().setName( inVehicle );

您必须知道您的Vehicle对象需要是可复制的,默认可构造且可分配。

从您之前的问题看,虽然看起来车辆实际上是一个基类。因此,您需要一个指针向量。如果您无法使用shared_ptr(并且我认为unique_ptr不可用),则必须使用new来创建实际的基础类。 Vehicle需要有一个虚拟析构函数,您需要在以后删除这些对象,因为std::vector不会删除您的指针。

答案 1 :(得分:0)

可能问题与程序的这一部分有关:

cout << "Enter Vehicle Type";
cin >> inVehicle;
你输入一整句话吗?如果这样做,那么第一个空格之后的剩余部分将存储在输入缓冲区中,第二个循环将不起作用。

尝试以下方法:

cout << "Enter Vehicle Type";
getline( cin, inVehicle );

你必须#include实用程序。另外,不要忘记:

v1->setName(inVehicle);
list.push_back( v1 );

但是,矢量的定义是错误的,应该是:

vector<Vehicle *> list;

在将对象添加到向量之前不要忘记创建一个新对象:

v1 = new Vehicle;
v1->setName(inVehicle);
list.push_back( v1 );

希望这有帮助。