在多重继承中使用 std::unique_ptr
Using std::unique_ptr in multiple inheritance
我正在编写一个程序来模拟两种动物——狼和兔子。
在我的代码中,我有虚拟接口 class IAnimal,以及称为 Animal 的基 class。所以,在一部分代码中,我需要创建我的动物的新实例,我这样写:
void Simulation::age_and_multiply_and_die() {
for (auto *animal: animals) {
if (animal->is_dead()) continue;
animal->aging();
if (animal->must_multiply()) {
switch (animal->get_type()) {
case Type::Rabbit: {
spawn_animal(new Rabbit((Animal *) animal, *this));
break;
}
case Type::Wolf: {
spawn_animal(new Wolf((Animal *) animal, *this));
((Wolf *) animal)->hungry_again();
break;
}
}
}
其中 spawn_animal() 是:
void spawn_animal(IAnimal *animal) {
animals.push_back(animal);
Coords pos = animal->get_position();
field[pos.y][pos.x].push_back(animal);
}
所以,我想摆脱 switch 语句并使用 unique_ptr 来做这样的事情:
class IAnimal {
public:
virtual Coords get_position() = 0;
virtual std::unique_ptr<IAnimal> breed() = 0;
...
void Simulation::age_and_multiply_and_die() {
for (auto *animal: animals) {
if (animal->is_dead()) continue;
animal->aging();
if (animal->must_multiply()) {
IAnimal child = animal.breed();
if (child)
animals.push_back(child);
}
}
我该怎么做?
你的breed
方法returns一个unique_ptr
,所以你应该写你的调用代码来接收一个unique_ptr
:
std::unique_ptr<IAnimal> child = animal.breed();
因为unique_ptr
不支持复制,你应该move
插入你的数据结构时:
if (child)
{
animals.push_back(std::move(child));
}
注意:您的代码修改了它迭代的容器。这是被禁止的,会导致棘手的问题。相反,创建一个新的 vector
,将其填充到您的循环中,然后才丢弃旧的 vector
.
我正在编写一个程序来模拟两种动物——狼和兔子。 在我的代码中,我有虚拟接口 class IAnimal,以及称为 Animal 的基 class。所以,在一部分代码中,我需要创建我的动物的新实例,我这样写:
void Simulation::age_and_multiply_and_die() {
for (auto *animal: animals) {
if (animal->is_dead()) continue;
animal->aging();
if (animal->must_multiply()) {
switch (animal->get_type()) {
case Type::Rabbit: {
spawn_animal(new Rabbit((Animal *) animal, *this));
break;
}
case Type::Wolf: {
spawn_animal(new Wolf((Animal *) animal, *this));
((Wolf *) animal)->hungry_again();
break;
}
}
}
其中 spawn_animal() 是:
void spawn_animal(IAnimal *animal) {
animals.push_back(animal);
Coords pos = animal->get_position();
field[pos.y][pos.x].push_back(animal);
}
所以,我想摆脱 switch 语句并使用 unique_ptr 来做这样的事情:
class IAnimal {
public:
virtual Coords get_position() = 0;
virtual std::unique_ptr<IAnimal> breed() = 0;
...
void Simulation::age_and_multiply_and_die() {
for (auto *animal: animals) {
if (animal->is_dead()) continue;
animal->aging();
if (animal->must_multiply()) {
IAnimal child = animal.breed();
if (child)
animals.push_back(child);
}
}
我该怎么做?
你的breed
方法returns一个unique_ptr
,所以你应该写你的调用代码来接收一个unique_ptr
:
std::unique_ptr<IAnimal> child = animal.breed();
因为unique_ptr
不支持复制,你应该move
插入你的数据结构时:
if (child)
{
animals.push_back(std::move(child));
}
注意:您的代码修改了它迭代的容器。这是被禁止的,会导致棘手的问题。相反,创建一个新的 vector
,将其填充到您的循环中,然后才丢弃旧的 vector
.