gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-27 23:45:57 24 4
gpt4 key购买 nike

我在 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com