c++ - 将指向 vector 的指针推回然后修改其值会影响插入的值。我应该怎么做呢?

标签 c++ c++11 pointers vector polymorphism

我在 C++ 中使用指针来实现多态性,并将指向派生类的指针存储到 vector 中。更改存储指针的值会影响同一指针的所有拷贝的值,但我想单独修改每个对象的值。是否可以?

主类

#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

最佳答案

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

因此您最好使用智能指针,std::unique_ptrstd::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"));

关于c++ - 将指向 vector 的指针推回然后修改其值会影响插入的值。我应该怎么做呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50584901/

相关文章:

c++ - 避免被无符号整数除法签名

c - C 中指向数组的指针

c++ - 对 pthread CLion 的 undefined reference

c++ - 部分聚合初始化和非静态数据成员初始化器

c++ - 返回值语法重载 const 和非 const 函数

c - 错误 : dereferencing pointer to incomplete type (Codeblocks, 在 C 中编程)

delphi - 如何解决Delphi错误: Incompatible types: 'PWideChar' and 'Pointer'

C++ 在模板类中返回 protected 结构指针

c++ - QList 语句

C++模板: one list by class,如何分解代码?