我有一个指针数组:
Hotel *hotels[size];
for (int i = 0; i < size; ++i)
hotels[i] = new Hotel();
我想在一个知道名字的对象之后在这个数组中插入一个对象:
cin >> tmp_name;
for (int i = 0; i < size; i++) {
if (hotels[i]->get_name() == tmp_name) {
hotels[size] = new Hotel();
size += 1;
Hotel *tmp_hotel;
tmp_hotel = hotels[i+1];
hotels[i+1]->fillHotel();
for (i = i + 2; i < size; i++) {
hotels[i] = tmp_hotel;
tmp_hotel = hotels[i+1];
}
break;
}
}
我做错了什么?
UPD: 我的解决方案:
cin >> tmp_name;
for (int i = 0, j = 0; i < size; i++, j++) {
new_hotels[j] = hotels[i];
if (hotels[i]->get_name() == tmp_name) {
new_hotels[j+1]->fillHotel();
++j;
system("clear");
}
}
hotels[size] = new Hotel();
++size;
for (int i = 0; i < size; i++) {
hotels[i] = new_hotels[i];
}
答案 0 :(得分:3)
我可以在您的代码中看到不同的错误。
例如:
Hotel *hotels[size];
size
应该是常量表达式,让我觉得情况并非如此。 VLA不属于 C ++ 标准。简而言之,您无法在堆栈上分配动态内存。正确的初始化应该是:
Hotel* hotels = new Hotel*[size];
循环中的一行:
hotels[size] = new Hotel();
您实际访问数组的界限:size
索引是某些内存未包含在您的数组中,这将产生未定义的行为。
另一个奇怪的路线如下:
size += 1;
尽管确认size
不是常量,但您无法通过简单地更改该变量来增加向量的大小。您实际上只是更改变量size
,但为阵列分配的内存将是相同的。
为了增加(或改变)数组的大小,解决方案几乎总是创建一个 new 数组,复制旧数组。在你的情况下,解决方案是非常合理的,因为你应该只复制指针而不是整个对象。
S.O.上有很多问题。这个主题的位置,例如here。
尽管如此,我强烈建议您使用最实用的替代方法,即使用真正的C ++代码。
最有效的类是std::vector
,这是处理动态数组的 C ++ 方法。
最后,您还应该考虑使用std::unique_ptr<T>
类来处理动态内存和指针。
最终解决方案将是一个类:
std::vector<std::unique_ptr<Hotel>> hotels;