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

标签 c++ arrays

我的作业是我必须创建一个类(寄存器),其中包含动物类中的 3 个类数组(鸟类、哺乳动物、爬行动物)。 Animal 是 Register 的 friend 。为了简单起见,我只会展示鸟类部分。

注册类如下所示:

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

寄存器的构造函数:

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

现在我在 register 中有一个函数,它向 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 只鸟。到达“else”下的部分时会出现问题,因此是数组的第二个元素。该程序肯定会达到“temp[birdSize+1].add();”在运行时,然后弹出“xyz.exe 已停止工作”窗口,并在详细信息中显示“故障模块名称:StackHash_7e8e”所以我确定内存分配有问题,但问题是当我尝试在 Debug模式下找到有问题的行,一切正常。

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

我不知道该怎么办。看了很多论坛的帖子,看了cpp的书,看了网上的教程,都没有找到解决这个问题的办法。请帮忙。

最佳答案

数组索引从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 仅当大小固定时才是。

关于c++ - 类内的类数组 - 动态数组的问题 (c++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23593898/

相关文章:

c++ - 我应该遵循什么方向来向我的应用程序添加网络服务功能?

c++ - 将 C++11 转换为等效的 C++98 代码

c++ - 从 64 位整数秒数创建一个 boost::posix_time::ptime 对象

c - 在 C 中对结构数组进行排序

c++ - MFC中如何将BYTE数组转换为CString?

c++ - 调用 operator new 没有匹配的函数

javascript - 在 JavaScript 中的数组中搜索

c - 试图用指针来理解这句话

java - 自然排序和全排序的区别

javascript - 根据值对具有键值对的对象进行排序