gpt4 book ai didi

c++ - 向其添加单独对象后所有相同对象的对象 vector

转载 作者:行者123 更新时间:2023-11-28 02:43:42 25 4
gpt4 key购买 nike

因此,我将一堆对象添加到我的类中的 vector 中。我可以添加所有内容,或者看起来很好,但是当我去打印 vector 的内容时,所有内容都是我添加的最后一个对象。这是为什么?这是我添加时的样子

this->packages.push_back(mc);

这是我调用要打印的对象时的样子

std::cout << truck.packages[1]->getTrack() << endl;

我不确定我做错了什么, vector 在添加和删除项目时似乎非常直接。

如果我需要添加任何其他内容,请告诉我。

  std::cout << truck.packages[1]->getTrack() << endl;
std::cout << truck.packages[2]->getTrack() << endl;

Output: 11111
11111

这就是我创建对象的方式

if(type == 0){
Letter *letter = new Letter();
letter->setType("Letter");
letter->setWeight(weight);
letter->setTrack(track);
price = letter->cost();
letter->setPrice(price);

this->packages.push_back(letter);

truckWeight = this->getGross() + (weight / 16);
this->setGross(truckWeight);

this->numPackages++;

delete letter;

这是 letter.cpp

Letter::Letter()
{
this->type = "Letter";
this->price = 0.0;
this->weight = 0;
this->trackingNumber = 0;
}

double Letter::cost()
{
int weight = this->getWeight();
if(weight > 32)
return 0.0;
else
return (0.5 * weight);
}

这是 letter.h

class Letter: public Package{`enter code here`

public:
Letter();

double cost();
};

用 Letter 制作。我使用哪个对象并不重要。他们都做同样的事情

最佳答案

您的代码中有 UB。你有一个 vectorLetter*秒。当你push_back这些Letter* s, vector 只是复制这些指针。一旦您调用 delete在原来的Letter* ,这些 vector 元素现在是悬空的。您可以通过两种方式处理此问题:

  1. 制作package一个vector<Letter>而不是 vector<Letter*> .现在,你开心就好push_back (或者,最好是 emplace_back )Letter s.
  2. 如果必须使用指针,请使用 unique_ptr (或其他一些智能指针)。所以,package将是 vector<unique_ptr> .当 vector 被破坏时,unique_ptr s 将负责内存释放。

如果你不想使用智能指针,你将不得不管理 delete是你自己。所以,如果 packageMyAwesomePackage 的成员(没有双关语意),你会在析构函数中这样做:

MyAwesomePackage::~MyAwesomePackage()
{
///Other destruction
for(auto * letter : package)
delete letter;
}

关于c++ - 向其添加单独对象后所有相同对象的对象 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25091961/

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