繁体   English   中英

如何在C ++中“调整”对象的动态数组的大小

[英]How to “resize” a dynamic array of objects in c++

可以说我有一个类播放器,它具有成员变量num_houses和类型为house的指针temp1

class player{
private:
    int num_houses;
    house* temp1;
public:
    player(){
    num_houses = 0;
    temp1 = new house[num_houses];
}

当我尝试调整房屋类型的大小或基本上将房屋类型的元素添加/删除时,我的问题出在我的代码上。 在我的代码中,我碰巧遇到了分段错误。 我很困惑,我是学生,所以任何建议或批评都将对我有很大帮助!

void player::add_house(house tkn){
    house* temp = new house[num_houses];
    for(int i = 0; i < num_houses; i++){
        temp[i] = temp1[i];
    } 
    num_houses++;
    if(temp1 != NULL){
        delete [] temp1;
    }
    temp1 = new house[num_houses];
    for(int i = 0; i < num_houses-1; i++){
        temp1[i] = temp[i];
    }
    temp1[num_houses-1] = tkn;
    delete [] temp;
}
temp1 = new house[num_houses];

num_houses0时出现问题。

将默认构造函数更改为:

player() : num_houses(0), temp1(nullptr) {}

您可以简化成员函数add_house以便减少一对新的/删除的。

void player::add_house(house tkn){

    num_houses++;
    house* temp = new house[num_houses];
    for(int i = 0; i < num_houses-1; i++){
        temp[i] = temp1[i];
    } 

    temp[num_houses-1] = tkn;

    if(temp1 != nullptr){
        delete [] temp1;
    }

    temp1 = temp;
}

要增加数组大小,请重写算法以执行以下步骤:

  1. 分配大小为current + 1的新临时数组。
  2. 将所有内容从当前数组复制到临时数组。
  3. 房屋增加量。
  4. 删除当前数组。
  5. 将指向临时数组的指针保存到当前数组指针。
  6. 将新房子添加到当前数组的末尾。

当然,如果您了解如何,可以重新排列此列表的顺序(4总是在1之后,6总是在1之后,5总是在4之后,依此类推)。

PS,您不必在删除指针之前检查指针是否不为null-删除nullptr不会失败。

UPD :添加的代码

void player::add_house(house tkn {
    house* temp = new house[num_houses + 1];
    for(int i = 0; i < num_houses; i++) {
        temp[i] = temp1[i];
    }
    num_houses++;
    delete [] temp1;
    temp1 = temp;
    temp1[num_houses-1] = tkn;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM