gpt4 book ai didi

c++ - 我需要动态调整对象数组的大小

转载 作者:行者123 更新时间:2023-12-03 07:00:36 24 4
gpt4 key购买 nike

每次填满时,我都需要将我的数组动态调整为 2。它以 2 的容量开始。这就是我所做的(在 main.cpp 中),但它给了我这些错误:“警告:删除数组 'test'”和“错误:'ItemInfo* 分配中的类型不兼容” ' 到 'ItemInfo [cap]'"。

ItemInfo test[cap];

//I have code here to open file, read from file, etc

if(itemCount >= cap){
cap += 2;
ItemInfo *temp;
temp = new ItemInfo[cap];
for(int i = 0; i < cap; i++){
temp[i] = test[i];
}
delete[] test; //error here
test = temp; //error here
}
这是类(在 .hpp 文件中):
#include <iostream>
#include <iomanip>

using namespace std;

class ItemInfo {
private:
int itemId;
char description[40];
double manCost;
double sellPrice;
public:
ItemInfo() {
itemId = 0;
*description = '\0';
manCost = 0.0;
sellPrice = 0.0;
}
void setItemId(const char *num);
void setDescription(const char *cstr);
void setManCost(const char *num);
void setSellPrice(const char *num);
int getItemId();
const char *getDescription();
double getManCost();
double getSellPrice();

最佳答案

问题是你用了ItemInfo test[cap]; .使用此声明会导致 test被保存在堆栈中。因此,它具有恒定的大小。使用 temp = new ItemInfo[cap];在堆上动态分配内存。这是您也可以释放的内存。因此,testtemp是不同的类型和 test无法释放。 ItemInfo *test = new ItemInfo[cap];应该为你工作。
还要注意还有一个小错误:你复制了第一个 cap许多值增加 cap哪里老cap应该使用。
您可以使用 realloc如果 ItemInfotrivially copyable 这样您就不需要循环来复制数据并暂时使用比可能需要的更多的内存。使用 realloc 的代码看起来像

ItemInfo *test = (*ItemInfo) malloc(cap * sizeof(ItemInfo));
// use malloc here as realloc and new should not be mixed
[...]
if(itemCount >= cap){
cap += 2;
test = (*ItemInfo) realloc(test, cap * sizeof(ItemInfo));
}
正如 user4581301 提到的,你也可以尝试使用 Vectors如果没有什么特别反对的话。

关于c++ - 我需要动态调整对象数组的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64253990/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com