如何在c ++中“调整”动态对象数组

时间:2018-05-09 05:45:31

标签: c++

假设我有一个类播放器,它有成员变量num_houses和类型为house的指针temp1

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

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

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

2 个答案:

答案 0 :(得分:1)

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 :(得分:1)

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

  1. 分配大小为当前+ 1的新临时数组。
  2. 将当前数组中的所有内容复制到临时数组。
  3. 增加房屋数量。
  4. 删除当前数组。
  5. 将指向临时数组的指针保存到当前数组指针。
  6. 将新房添加到当前数组的末尾。
  7. 当然,如果您了解如何(4总是在1之后,6总是在1之后,5之后总是在4之后等等),你可以重新排序这个列表。

    P.S。在删除指针之前,你不必检查指针是否为空 - 删除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;
    }