C++ 在多重继承中使用std::unique_ptr
我正在编写一个程序,用两种动物——狼和兔子——进行模拟。 在我的代码中,我有虚拟接口类IAnimal和基类Animal。因此,在代码的一部分中,我需要创建我的动物的新实例,我写了以下内容:C++ 在多重继承中使用std::unique_ptr,c++,class,multiple-inheritance,unique-ptr,C++,Class,Multiple Inheritance,Unique Ptr,我正在编写一个程序,用两种动物——狼和兔子——进行模拟。 在我的代码中,我有虚拟接口类IAnimal和基类Animal。因此,在代码的一部分中,我需要创建我的动物的新实例,我写了以下内容: void Simulation::age_and_multiply_and_die() { for (auto *animal: animals) { if (animal->is_dead()) continue; animal->aging(); if (animal-
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()是:
因此,我想摆脱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);
}
}
类IAnimal{
公众:
虚拟坐标get_position()=0;
虚拟std::unique_ptr breed()=0;
...
空洞模拟::老化和相乘{
用于(自动*动物:动物){
如果(动物->死亡())继续;
动物->衰老();
如果(动物->必须繁殖()){
IAnimal child=动物。繁殖();
如果(儿童)
动物。推回(儿童);
}
}
我该怎么做呢?您的
breed
方法返回一个unique\u ptr
,因此您应该编写调用代码来接收unique\u ptr
:
std::unique_ptr<IAnimal> child = animal.breed();
注意:您的代码修改它所迭代的容器。这是禁止的,并且会导致棘手的问题。取而代之的是,创建一个新的
向量
,将其填充到循环中,然后才丢弃旧的向量您的繁殖
方法返回一个唯一的\u ptr
,因此您应该编写调用代码to接收一个唯一的\u ptr
:
std::unique_ptr<IAnimal> child = animal.breed();
注意:您的代码会修改它所迭代的容器。这是禁止的,并且会导致棘手的问题。相反,创建一个新的向量
,将其填充到循环中,然后才丢弃旧的向量,您认为唯一的\u ptr
为什么与去掉switch语句有关?作为一个n这里的ew用户,请同时阅读。我猜您的问题是一个编译错误。不确定我是否猜对了。无论如何,您可以发布您的帖子并描述您遇到的特定问题。为什么您认为unique\u ptr
与删除switch语句有关?作为这里的新用户,请同时使用和ead。我猜你的问题是编译错误。我不确定我是否猜对了。无论如何,你可以在你的帖子中描述你遇到的具体问题。
if (child)
{
animals.push_back(std::move(child));
}