将指针向后推到向量,然后修改其值会影响推送的值。我该怎么做呢? 我使用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
,因为这样可以节省您以后手动清理指针的时间。您可以从将两个指针推到同一个对象开始。如果您要在指向的对象上设置很多参数,然后您只想创建一个新对象,只需对前一个对象稍作修改,你也可以考虑执行<代码>动物*动物::克隆()。代码>接口。如果在指向对象上设置了很多参数,然后只想创建一个新对象,只对前一个对象稍加修改,您也可以考虑执行<代码>动物*:::克隆()。代码>界面。