将对象插入具有动态内存的数组(不允许向量)C++

Mat*_*w S 3 c++ arrays pointers memory-management

不允许专门为此学校作业使用向量.我发现的大多数答案只是说"你应该使用向量"作为最高投票评论.虽然我很欣赏并理解这一点,但我只是限制使用它们来完成这项任务.

它是一个带有动态内存管理的C++赋值,如下所示:

// property in header declaration
int numAnimals;
int capacity;
Animal** animals; 
void addAnimal(Animal *newAnimal);

// class implementation
capacity = 10;
numAnimals = 0;

animals = new Animal*[capacity];

void SampleClass::addAnimal(Animal *newAnimal)
{
  for (int i = 0; i < capacity; i++){
       if(animals[i]){
          // animal object already exists in array, move on
          i++;
       }else{
          animals[i] = newAnimal;
          numAnimals++;
          break;
       }
   }
}
Run Code Online (Sandbox Code Playgroud)

animals是指向指针的指针,在这种情况下是指向尚未创建的对象类型Animal的指针数组的指针.

使用'addAnimal'函数,我要做的是通过循环遍历指针数组将动物对象添加到数组中,如果已存在动物对象,则迭代到下一个索引.如果没有动物,则将该动物插入阵列.

当我尝试访问数组中动物对象的成员函数时,我得到一个异常抛出"读取访问冲突".

我的怀疑是因为: if(animals [i])可能没有做我认为它正在做的事情,通过调试器运行它我从未点击'else'部分,所以数组仍然没有设置任何对象的指针当方法完成时.因此,当我尝试访问成员函数时,它是一个不存在的对象.

那么,如果我的怀疑是正确的,那么以这种方式将新对象插入指针数组的最佳方法是什么?它们需要是指针,否则它会自动创建充满填充对象的数组,这不是我想要的.

我没有发布所有代码,因为我想保持我的问题简短,道歉我是一个新的C++和stackoverflow一般.是的,我知道删除[]后清除内存.

任何帮助表示赞赏,谢谢!

Mr.*_*C64 5

因为在numAnimals你保持数组中当前动物指针数的数量,你不需要for循环找到第一个可用的插槽来添加一个新的动物指针(请注意,假设你想使用for如图所示的循环你的代码,你必须注意正确初始化数组中的所有初始指针nullptr).

你可以使用:

// Inside SampleClass::addAnimal(Animal *newAnimal):

animals[numAnimals] = newAnimal;
numAnimals++;
Run Code Online (Sandbox Code Playgroud)

请注意,当您插入新动物时,您必须注意不要溢出阵列容量.
因此,在插入新动物之前,您必须检查阵列中是否有足够的空间,例如:

// Before inserting:
if (numAnimals == capacity) 
{
    // You ran out of capacity.
    //
    // 1. Allocate a new array with bigger capacity (e.g. 2X)
    // 2. Copy the content from the current array to the new one
    // 3. delete current array
}
Run Code Online (Sandbox Code Playgroud)

作为旁注:

是的,我知道要delete[]事后清理记忆

请注意,如果你调用delete[]animals的指针数组,你释放这个指针数组,而不是Animal对象指向.