Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在多重继承中使用std::unique_ptr_C++_Class_Multiple Inheritance_Unique Ptr - Fatal编程技术网

C++ 在多重继承中使用std::unique_ptr

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-

我正在编写一个程序,用两种动物——狼和兔子——进行模拟。 在我的代码中,我有虚拟接口类IAnimal和基类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));
}