因此,我将一堆对象添加到我的类中的 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。你有一个 vector
的 Letter*
秒。当你push_back
这些Letter*
s, vector 只是复制这些指针。一旦您调用 delete
在原来的Letter*
,这些 vector 元素现在是悬空的。您可以通过两种方式处理此问题:
- 制作
package
一个vector<Letter>
而不是vector<Letter*>
.现在,你开心就好push_back
(或者,最好是emplace_back
)Letter
s. - 如果必须使用指针,请使用
unique_ptr
(或其他一些智能指针)。所以,package
将是vector<unique_ptr>
.当 vector 被破坏时,unique_ptr
s 将负责内存释放。
如果你不想使用智能指针,你将不得不管理 delete
是你自己。所以,如果 package
是 MyAwesomePackage
的成员(没有双关语意),你会在析构函数中这样做:
MyAwesomePackage::~MyAwesomePackage()
{
///Other destruction
for(auto * letter : package)
delete letter;
}
关于c++ - 向其添加单独对象后所有相同对象的对象 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25091961/