如何在指针数组中插入对象

时间:2016-10-01 08:41:54

标签: c++

我有一个指针数组:

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];
}

1 个答案:

答案 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;