从数组指针参数设置数组

时间:2014-08-10 08:41:08

标签: c++

Zoo::Zoo(Name* name, Location* location, Animal* animals[]) {
    this->name = name;
    this->location = location
 }

我的Zoo类还有一个名为animals的变量,用于存储未知数量的Animal个对象。

如何在上面的构造函数中设置它?

2 个答案:

答案 0 :(得分:1)

使用C ++容器,而不是原始C数组。

#include <vector>

Zoo::Zoo(Name* name, Location* location, const std::vector<Animal*>& animals) {
    this->name = name;
    this->location = location;
    this->animals = animals;
}

使用std::vector,您无需知道有多少动物。你的类定义看起来像这样:

class Zoo {
    Name * name;
    Location * location;
    std::vector<Animal *> animals;
    /* ... */
};

如果你想走这条路(我强烈推荐它,我认为大多数C ++社区都会同意),你应该查阅一下std::vector的基本用法教程,以及其他一些相关类,例如std::liststd::setstd::unordered_set,它们都有各自的优点/缺点。我推荐std::vector,因为它的行为最接近原始C数组的行为,同时仍然可以安全地调整大小。


在C ++中,编写复制其他对象的构造函数的最佳方法是使用初始化列表。那些看起来像这样。

Zoo::Zoo(Name* n, Location* l, std::vector<Animal*> a) : name(n), location(l), animals(a) {}

这里的区别在于,Zoo构造函数的参数在构造函数的代码运行之前直接转发到Zoo成员的构造函数。在这种情况下,由于这就是需要完成的所有工作,因此构造函数没有任何事情要做,而且是空的({})。

答案 1 :(得分:0)

您可以使用std :: vector,如下所示

#include <vector>

Zoo::Zoo(Name* name, Location* location, std::vector<Animal*> animals) {
    this->name = name;
    this->location = location;
    this->animals = animals;  // where animals is an attribute in your Zoo class
 }

您可以按顺序手动复制animals数组中的每个元素。但是,这意味着要么已知数组中的元素数,要么将最后一个元素设置为已知值(例如NULL)。然后代码变为:

#include <vector>

Zoo::Zoo(Name* name, Location* location, Animal** animals, size_t nAnimals) {
    this->name = name;
    this->location = location;
    // Animal **animals; // this is the attribute in Zoo
    this->animals = new Animal*[nAnimals];
    for(size_t i = 0; i < nAnimals; i++) {
             this->animals[i] = new Animal(); // assuming default constructor for Animal class 
             memcpy(this->animals[i], animals[i], sizeof(Animal));
    }

为了释放分配的内存,请在析构函数中使用以下代码(~Animal())

for(size_t i = 0; i < nAnimals; i++)
                 delete this->animals[i]; 
delete[] animals;