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

How to insert an object in the array of pointers

本文关键字:插入 对象 数组 指针      更新时间:2023-10-16

我有一个指针数组:

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

我做错了什么?

乌利希期刊指南:我的解决方案:

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

我可以在你的代码中看到不同的错误。


例如:

Hotel *hotels[size];

size应该是一个常量表达式,有些东西让我认为情况并非如此。VLA不是 c++ 标准的一部分。简而言之,您不能在堆栈上分配动态内存。正确的初始化应该是:

Hotel* hotels = new Hotel*[size];

循环中的行:

hotels[size] = new Hotel();

你实际上访问超出了你的数组:size索引是一些内存不包括在你的数组,这将产生一个未定义的行为


另一个奇怪的行如下:

size += 1;

尽管事实证明size不是一个常数,你不能简单地改变这个变量来增加向量的大小。您实际上只是更改了一个变量size,但是为您的数组分配的内存将是相同的。


<标题>如何解决?

为了增加(或改变)数组的大小,解决方案几乎总是创建一个新的数组,复制旧数组。在你的情况下,这个解决方案是非常合理的,因为你应该只复制指针,而不是整个对象。

关于S.O.这个话题有很多问题,比如这里。

尽管如此,我强烈建议您使用最实用的替代方案,即使用真正的c++代码

最有效的类是std::vector,这是一个 c++ 处理动态数组的方法。

最后,还应该考虑使用std::unique_ptr<T>类来处理动态内存和指针。

最终的解决方案将是一个类:

std::vector<std::unique_ptr<Hotel>> hotels;