向量的对象所有相同的对象后,添加单独的对象到它
vector of object all the same object after adding separate objects to it
所以我在类中的向量中添加了一堆对象。我可以添加所有的东西,或者看起来很好,但是当我要打印向量的内容时所有的东西都是我添加的最后一个对象。为什么呢?这就是添加
后的效果 this->packages.push_back(mc);
这是我调用要打印的对象时的样子
std::cout << truck.packages[1]->getTrack() << endl;
我不知道我做错了什么,向量似乎很直接地添加和删除项目。
如果我还需要补充什么,请告诉我。
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;
This is 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);
}
这是字母h
class Letter: public Package{`enter code here`
public:
Letter();
double cost();
};
Made it with Letter。我用哪个对象都没关系。它们都是一样的
您的代码中有UB。你有一个Letter*
的vector
。当你push_back
这些Letter*
时,向量只是复制了这些指针。一旦在原来的Letter*
上调用delete
,这些向量元素现在就悬空了。您可以通过两种方式处理此问题:
- 将
package
改为vector<Letter>
而不是vector<Letter*>
。现在,您只需高兴地push_back
(或者,最好是emplace_back
)Letter
s。 - 如果你必须使用指针,使用
unique_ptr
(或其他智能指针)。所以package
就是vector<unique_ptr>
。当vector被销毁时,unique_ptr
将负责内存释放。
如果你不想使用智能指针,你将不得不自己管理delete
。因此,如果package
是MyAwesomePackage
的成员(没有双关语的意思),您将在析构函数中执行此操作:
MyAwesomePackage::~MyAwesomePackage()
{
///Other destruction
for(auto * letter : package)
delete letter;
}
虽然您没有显示vector的声明,但您在此语句中的用法:
std::cout << truck.packages[1]->getTrack() << endl;
表明你不是在构建一个对象的向量,而是一个指向对象的指针的向量。
如果vector仅包含一个指针,并且在将指针压入vector后修改了该指针所引用的对象,则稍后通过vector中的指针访问该指针时将看到新值。
你可能正在做这样的事情:
std::vector<Package*> packages;
mc = new Package;
mc->setFoo(1);
packages.push_back(mc);
mc->setFoo(2);
packages.push_back(mc);
现在有两个指针指向vector中的同一个对象。由于在第一次push_back()
调用之后修改了对象,因此当访问vector中的任意一个元素时,将看到对象的新值。
要做到这一点,您需要在vector中存储实际对象:
std::vector<Package> packages;
或者在每次将指针压入vector之前分配一个新的Package
对象。
看完完整的代码后,你的问题稍微有点不同:你在将指向对象的指针压入vector后删除了对象。因此,vector包含指向已删除对象的指针,这会导致未定义的行为。在您的测试用例中可能发生的是,当您在删除前一个对象后分配新对象时,您将再次获得指向相同内存的指针。这就是为什么看起来所有的值都是一样的。但即便如此,这也是"随机的"和完全未指定的行为。
- C++ 将子类的对象添加到父类的向量中
- 如何在qt中将对象添加到现有布局中?--已解决
- 测试驱动开发 c++:如何将对象添加到向量中,将歌曲添加到播放列表并对其进行测试
- 在C++中将对象添加到 2D 矢量
- 如何将对象添加到类中的静态向量
- 重载加法运算符(使用函数向对象添加字符串)
- 将对象添加到数组时EXC_BAD_ACCESS
- 仅为从某种语言编译的对象添加链接库?
- C++将带有重载构造函数的对象添加到另一个对象
- 如何在 c++ 中将对象添加到数组中?
- 尝试向 COM 对象添加另一个接口时出现静态强制转换错误 C2440
- 使用类函数将类对象添加到数组中
- 如何在 c c ++ 混合生成文件中为 c 对象添加附加规则?
- 如何从列表中将对象添加到图表中?
- 将对象添加到LinkedList C 中
- 将动态分配的对象添加到对象指针数组中
- 用于将对象添加到指针数组的函数
- 为什么我的代码没有将每个对象添加到向量中
- 是 std::make_pair 在将对象添加到地图时创建副本
- 当我将对象添加到向量时,为什么typeID名称会更改