加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 10:14:23 所属栏目:百科 来源:网络整理
导读:我不允许专门为此学校作业使用向量.我发现的大多数答案只是说“你应该使用向量”作为最高投票评论.虽然我很欣赏并理解这一点,但我只是限制使用它们来完成这项任务. 它是一个具有动态内存管理的C赋值,如下所示: // property in header declarationint numAni
我不允许专门为此学校作业使用向量.我发现的大多数答案只是说“你应该使用向量”作为最高投票评论.虽然我很欣赏并理解这一点,但我只是限制使用它们来完成这项任务.

它是一个具有动态内存管理的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;
       }
   }
}

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

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

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

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

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

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

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

解决方法

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

你可以使用:

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

animals[numAnimals] = newAnimal;
numAnimals++;

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

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

作为旁注:

Yes,I know to delete[] to clear memory afterwards

请注意,如果在animals数组指针上调用delete [],则释放此指针数组,但不释放指向的Animal对象.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读