C++11 vecteur de pointeur intelligent

Supposons que nous avons les codes suivants. Nous avons des classes suivantes

  • Animal AbstractClass
  • Le chien et l'Oiseau qui est sous-classe de l'Animal
  • Zoo, qui conserve tous les animaux

_

class Animal
{
public:
    Animal();
    void HasWings() = 0;
};

class Bird : public Animal
{
public:
    Bird() : Animal() {}
    void HasWings() override { return true; }
};

class Dog : public Animal
{
public:
    Dog() : Animal() {}
    void HasWings() override { return false; }
};

class Zoo
{
public:
    Zoo() {}
    void AddAnimal(Animal* animal) { _animals.push_back(animal); }
    ...
    std::vector<Animal*> _animals;
};

void myTest()
{
    Zoo myZoo;
    Bird* bird = new Bird();
    Dog* dog = new Dog();

    myZoo.AddAnimal(bird);
    myZoo.AddAnimal(dog);

    for (auto animal : myZoo._animals)
    {
        ...
    }
    ...
}

J'espère remplacer vecteur de pointeurs par vecteur de pointeurs intelligents. j'.e,

std::vector<std::shared_ptr<Animal>> _animals;

Comment faire pour changer le code de Zoo et myTest?
J'ai de la difficulté à trouver la mise à jour du code, en particulier la méthode "AddAnimal" dans le Zoo de classe

auto bird = std::make_shared<Bird>();
auto dog = std::make_shared<Dog>();
myZoo.AddAnimal(bird);
myZoo.AddAnimal(dog);

oiseau et le chien sont les différents type de

AddAnimal(std::shared_ptr<Animal> animal) - shared_ptr<Bird> et shared_ptr<Dog> convertir à shared_ptr<Animal> depuis les deux premiers sont des dérivés de ces derniers. Aussi Animal::HasWings est manquant virtual et puisque vous avez déjà une fonction membre virtuelle vous devriez aussi faire Animal's destructeur virtual

OriginalL'auteur user2434918 | 2015-02-26