类中的类数组 - 动态数组问题(c ++)

时间:2014-05-11 14:37:08

标签: c++ arrays

我的作业是我必须制作一个类(寄存器),其中包含动物类中的3类阵列(鸟类,哺乳动物,爬行动物)。 Animal是Register的朋友。我只会展示鸟类的一部分,以保持简单。

寄存器类如下:

class Register
{
    Bird* birds;
    unsigned int birdSize;
public:
    ...
}

注册的构造函数:

Register::Register()
{
    this->birds = new Bird[0];
    this->birdSize = NULL;    
}

现在我在寄存器中有一个函数,它将一个元素添加到birds数组中,输入是cin。

void Register::add()
{
 ...
        if (birdSize == 0)
        {
            birds = new Bird[0];
            Bird* temp = new Bird[0];
            temp[0].add();
            this->birds = temp;
            birdSize++;
        }
        else
        {
            Bird* temp = new Bird[birdSize+1];
            for (unsigned int i=0; i<=birdSize; i++)
            {
                temp[i] = this->birds[i];   
            }
            temp[birdSize+1].add();
            birds = new Bird[birdSize+1];
            birds = temp;
            birdSize++;
        }

temp [0] .add()有cin,它工作正常。当我运行程序时,用户必须向阵列添加2只鸟。到达&#39; else&#39;下的部分时出现问题,因此数组的第二个元素。该程序肯定会达到&#34; temp [birdSize + 1] .add();&#34;在运行时,&#34; xyz.exe已停止工作&#34;窗口弹出,它在细节中说明&#34;故障模块名称:StackHash_7e8e&#34;所以我确定内存分配有问题,但问题是当我尝试在调试模式下找到有问题的行时,一切正常。

嗯,不是一切。该程序有一个print()函数,它打印出Register中的所有内容。数组的第二个元素与第一个元素相同。

我不知道该怎么做。我阅读了很多论坛帖子,阅读了一本cpp书,看过在线教程,但我无法找到解决这个问题的方法。请帮忙。

1 个答案:

答案 0 :(得分:2)

数组索引从0开始。所以在else部分你正在编写

 Bird* temp = new Bird[birdSize+1]; // size =birdSize +1;

因此有效的索引范围将是 0 - > birdSize 不是birdSize + 1

问题是

temp[birdSize+1].add();

您正在使用birdSize+1索引。它应该是

temp[birdSize].add();

您的代码中还有其他错误:

for (unsigned int i=0; i<=birdSize; i++) // should be i<birdSize
{
  temp[i] = this->birds[i];   
}

您的计划中还有其他不良编码:

Register::Register()
{
  this->birds = new Bird[0]; // should be this->birds=NULL
  this->birdSize = NULL;    // should be this->birdSize = 0
}

显然,如果你的作业没有要求它,你就不应该以这种方式使用array。对于可变大小的容器,请使用vector, list...Array仅在大小已修复时才会出现。