将指针向后推到向量,然后修改其值会影响推送的值。我该怎么做呢? 我使用C++中的指针来实现多态性,我把指针派生到派生类中。更改存储指针的值会影响同一指针的所有副本的值,这是应该的,但是我想分别修改每个对象的值。可能吗

将指针向后推到向量,然后修改其值会影响推送的值。我该怎么做呢? 我使用C++中的指针来实现多态性,我把指针派生到派生类中。更改存储指针的值会影响同一指针的所有副本的值,这是应该的,但是我想分别修改每个对象的值。可能吗,c++,c++11,pointers,vector,polymorphism,C++,C++11,Pointers,Vector,Polymorphism,主类 #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->s

主类

#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
所需输出

Bad Dog
Bad Dog
Good Cat
Good Dog
Bad Dog
Good Cat

在您的代码中,您修改了相同的对象
Dog
,您需要在设置“Bad Dog”的描述之前创建新实例,并且您的程序中存在内存泄漏

因此,您最好使用智能指针,根据您需要的所有权类型,可以是
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");
std::vector animalVector;
animalVector.push_back(std::make_unique());
animalVector.back()->setDescription(“好狗”);
animalVector.push_back(std::make_unique());
animalVector.back()->setDescription(“坏狗”);
animalVector.push_back(std::make_unique());
animalVector.back()->setDescription(“好猫”);
如果你为每一种动物设置了描述,你应该把它传递给构造器,那么它会更干净、更短:

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"));
animalVector.push_back(标准::使_独一无二(“好狗”);
animalVector.push_back(性病::使_独一无二(“坏狗”);
animalVector.push_back(标准::使_独一无二(“好猫”);

在您的代码中,如果您修改了相同的对象
Dog
,您需要在设置“Bad Dog”的描述之前创建新实例,并且您的程序中存在内存泄漏

因此,您最好使用智能指针,根据您需要的所有权类型,可以是
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");
std::vector animalVector;
animalVector.push_back(std::make_unique());
animalVector.back()->setDescription(“好狗”);
animalVector.push_back(std::make_unique());
animalVector.back()->setDescription(“坏狗”);
animalVector.push_back(std::make_unique());
animalVector.back()->setDescription(“好猫”);
如果你为每一种动物设置了描述,你应该把它传递给构造器,那么它会更干净、更短:

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"));
animalVector.push_back(标准::使_独一无二(“好狗”);
animalVector.push_back(性病::使_独一无二(“坏狗”);
animalVector.push_back(标准::使_独一无二(“好猫”);

缺少
动物=新狗()
动物->设置描述(“坏狗”)
.FWIW我会使用一个
std::vector
,因为它可以节省您以后手动清理指针的时间。您可以从将两个指针推到同一个对象开始。缺少
animal=new Dog()
动物->设置描述(“坏狗”)
.FWIW我会使用
std::vector
,因为这样可以节省您以后手动清理指针的时间。您可以从将两个指针推到同一个对象开始。如果您要在指向的对象上设置很多参数,然后您只想创建一个新对象,只需对前一个对象稍作修改,你也可以考虑执行<代码>动物*动物::克隆()。代码>接口。如果在指向对象上设置了很多参数,然后只想创建一个新对象,只对前一个对象稍加修改,您也可以考虑执行<代码>动物*:::克隆()。代码>界面。