C++ 如何";调整“大小”;c++;

C++ 如何";调整“大小”;c++;,c++,C++,假设我有一个类播放器,它有成员变量num_house和类型为house的指针temp1 class player{ private: int num_houses; house* temp1; public: player(){ num_houses = 0; temp1 = new house[num_houses]; } 我的问题在于,当我试图调整大小或基本上将house类型的元素添加/删除到我的house数组中时,我的代码。在我的代码中,我碰巧遇到

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

class player{
private:
    int num_houses;
    house* temp1;
public:
    player(){
    num_houses = 0;
    temp1 = new house[num_houses];
}
我的问题在于,当我试图调整大小或基本上将house类型的元素添加/删除到我的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;
}
void播放器::添加房子(房子tkn){
房屋*临时=新房屋[房屋数量];
对于(int i=0;i
num\u house
0
时出现问题

将默认构造函数更改为:

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

您可以简化成员函数
add_house
,这样就可以减少一对new/delete

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;
}
void播放器::添加房子(房子tkn){
num_++;
房屋*临时=新房屋[房屋数量];
对于(int i=0;i
要增加数组大小,请重写算法以执行以下步骤:

  • 分配当前大小为+1的新临时阵列
  • 将所有内容从当前阵列复制到临时阵列
  • 增加房屋数量
  • 删除当前数组
  • 将指向临时数组的指针保存到当前数组指针
  • 将新房屋添加到当前阵列的末尾
  • 当然,如果您了解如何重新排列此列表(4始终在1之后,6始终在1之后,5始终在4之后等)

    另外,在删除指针之前,您不必检查指针是否不为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;
    }
    
    void玩家::添加房子(房子tkn){
    房屋*温度=新房屋[房屋数量+1];
    对于(int i=0;i
    既然这不能在C中编译,为什么要添加该标记?请不要这样做。只添加实际编程语言的语言标记。至于你的问题,只要你想到“动态数组”你下一个想法应该是。我被限制使用std::Vector此代码对我不起作用,因为没有定义temp2。想想看:如果你想增加数组,你只需要分配一次新数组。而不是两次。谢谢你的建议,我还想添加我的复制构造函数、析构函数和赋值操作符overload都是为我的house类创建的。你认为在这种情况下浅拷贝和深拷贝可能会有问题吗?我的程序中出现了一个“指针被释放时未分配”错误。@很可能是RobertYelas。请务必遵循。注意,我认为检查if(temp1!=nullptr)我们不需要。我们可以安全地使用null值调用delete。\r@Alexeishmakov,C++11标准对于
    delete
    的参数是
    nullptr
    时会发生什么是含糊不清的。请看。@RSahu,感谢您提供了有趣的链接。我不知道。
    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;
    }