Перемещение указателя назад к вектору и последующее изменение его значения влияет на переданное значение.Что мне делать вместо этого? - PullRequest
0 голосов
/ 29 мая 2018

Я использую указатели в c ++ для достижения полиморфизма, и я храню указатели на производные классы в вектор.Изменение значения сохраненного указателя влияет на значение всех копий одного и того же указателя, как и должно быть, однако я хотел бы изменить значение каждого объекта в отдельности.Является ли это возможным?

Основной класс

#include "Cat.h"
#include "Dog.h"
#include <vector>

int main()
{
  std::vector<Animal*> animalVector;

  Animal* animal;
  animal = new Dog();

  animal->setDescription("Good Dog");
  animalVector.push_back(animal);

  animal->setDescription("Bad Dog");
  animalVector.push_back(animal);

  animal = new Cat();

  animal->setDescription("Good Cat");
  animalVector.push_back(animal);

  for (auto& it : animalVector) {
    it->info();
  }
}

Базовый класс

#pragma once

#include <string>

using std::string;

class Animal
{
  protected:
    string mType; //! Holds the type of the Animal
    string mDescription; //! Holds the description of the Animal

  public:

    Animal();
    virtual ~Animal();
    virtual void info();

    virtual void setDescription(string description) {mDescription = description;}
};

Производный класс

#pragma once

#include "Animal.h"

class Dog : public Animal
{
  public:
    Dog();
};

Выход

Bad Dog
Bad Dog
Good Cat

Требуемый выход

Good Dog
Bad Dog
Good Cat

1 Ответ

0 голосов
/ 29 мая 2018

В вашем коде вы изменяете тот же объект Dog, вам нужно создать новый экземпляр, прежде чем вы установите описание для "Bad Dog", и у вас будет утечка памяти в вашей программе.

Так что вам лучше использовать Smartуказатели, либо std::unique_ptr, либо std::shared_ptr, в зависимости от того, какой тип владения вам нужен:

std::vector<std::unique_ptr<Animal>> animalVector;

animalVector.push_back( std::make_unique<Dog>());
animalVector.back()->setDescription("Good Dog");
animalVector.push_back( std::make_unique<Dog>());
animalVector.back()->setDescription("Bad Dog");
animalVector.push_back( std::make_unique<Cat>());
animalVector.back()->setDescription("Good Cat");

, и если вы зададите описание для каждого животного, вы должны передать его конструктору, тогда оно будет еще чище икороче:

animalVector.push_back( std::make_unique<Dog>("Good Dog"));
animalVector.push_back( std::make_unique<Dog>("Bad Dog"));
animalVector.push_back( std::make_unique<Cat>("Good Cat"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...