Zoo::Zoo(Name* name, Location* location, Animal* animals[]) {
this->name = name;
this->location = location
}
我的Zoo
类还有一个名为animals
的变量,用于存储未知数量的Animal
个对象。
如何在上面的构造函数中设置它?
答案 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::list
,std::set
和std::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;