我的程序/分配是一个“动物模拟”,涉及从动物基类继承的不同物种动物对象的动态数组[不能使用矢量]。但是我的问题似乎很简单(我希望如此):
我一直在使用结构
Animal **arr = new Animal*[10];
但是读取arr[0]->getAge()
会导致访问冲突。
我试图同时理解指针,但由于期限的原因,也许还希望对代码有完整的预理解。
我尝试过
*arr = new Animal[10]
但是当我想添加/更改数组中的对象或删除数组时遇到问题。也许
**新* *
仅适用于某些变量类型,不适用于类对象。我可以用
设置一个数组*arr = new Animal[10];
形成,但是当我尝试设置类似的东西
时 arr[05] = to a new Tiger object,
什么都没有改变,所以我碰壁了。
基本上,我需要初始化Animal对象的数组,然后将继承的类对象添加到该数组。感谢您的见解和歉意。
答案 0 :(得分:3)
在
Animal **arr = new Animal*[10];
Animal **arr
声明一个指向指针的指针。 new Animal*[10]
分配10个指向Animal
的指针。这10个指针尚未初始化,并且没有指向安全使用的任何地方。
arr[0]->getAge();
获取这10个指针的首位并尝试使用其指向的指针。由于它没有指向有效的Animal
,因此可能会发生任何事情。在这种情况下,程序似乎崩溃了。这是更好的结果之一,因为它会使错误立即引起注意。
现在假设Tiger
来自Animal
class Tiger: public Animal
{
// definition of Tiger
}
那么您以后就可以
arr[0] = new Tiger;
将10个指针中的第一个指向Tiger
的有效实例,然后可以
arr[0]->getAge();
完成后,请不要忘记delete
的所有Animal
和delete[]
arr
。
旁注:
不要这样写代码。这非常容易出错。而是利用std::vector
之类的标准库容器,而更喜欢std::unique_ptr
之类的智能指针来管理程序的动态内存。示例:
std::vector<std::unique_ptr<Animal>> arr;
制作一个Animal
的可调整大小的数组,当不再需要arr
并且超出范围时,它们将全部删除。
添加Tiger
就像
arr.push_back(std::make_unique<Tiger>());
这看起来比较麻烦,但是它使您不必在代码中查找必须delete
的资源的确切位置,并且可以绝对确定它们delete
的位置。
答案 1 :(得分:0)
您已经分配了一个指针数组,但实际上并没有为这些指针指向分配任何对象。因此arr[0]->...
是未定义的行为。