将指向矢量的指针推回,然后修改其值会影响推送的值.我应该怎么做?
Pushing back a pointer to a vector and then modifying its value affects the pushed value. What should i do instead?
我在 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
在代码中修改相同的对象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");
如果你为每只动物设置描述,你应该传递给它构造函数,那么它会更干净、更短:
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"));
相关文章:
- 我应该使用什么来代替void作为变体中的替代类型之一
- boost::asio::steady_timer()与sleep()我应该使用哪一个
- 我应该实现右值推送功能吗?我应该使用std::move吗
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 我应该删除矢量<short>吗?
- 我应该如何修改此代码以使用给定字符串中的字母打印菱形图案
- 我应该在锁定TBitmap画布后解锁它吗
- 为什么我应该在异常处理中使用std::cerr而不是std::cout
- 我应该避免多重实现继承吗
- 为了方便起见,我应该避免公开私有字段变量吗
- 我收到同义重复编译器错误。我应该如何修复"类型"X"的参数与类型"X"的参数不兼容?
- 违反const正确性:我应该现实地期待什么问题
- 我应该如何表示我拥有的连续元素序列?
- 我应该将除 .cpp 以外的其他文件添加到 git 中吗?
- 我应该如何从 stdin C++ 中读取可变长度的格式字符串?
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- 我应该如何捕捉out_of_range异常?
- 我应该声明所有不抛出 noexexcept 的成员/函数吗?
- 将指向矢量的指针推回,然后修改其值会影响推送的值.我应该怎么做?
- 我认为这是一个编译器错误,这不应该影响我的代码,但它是