簡體   English   中英

在多重繼承中使用 std::unique_ptr

[英]Using std::unique_ptr in multiple inheritance

我正在編寫一個程序,該程序運行模擬兩種動物 - 狼和兔子。 在我的代碼中,我有虛擬接口類 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() 是:

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方法返回一個unique_ptr ,因此您應該編寫您的調用代碼來接收一個unique_ptr

std::unique_ptr<IAnimal> child = animal.breed();

因為unique_ptr不支持復制,所以在插入數據結構時應該move它:

if (child)
{
      animals.push_back(std::move(child));
}

注意:您的代碼修改了它迭代的容器。 這是被禁止的,會導致棘手的問題。 取而代之的是,創建一個新的vector ,將其填充到您的循環中,然后才丟棄舊的vector

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM