gpt4 book ai didi

c++ - 实例化怪异

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

我有一个问题,指针 vector 似乎没有按照我预期的多态方式运行。奇怪的是它适用于它指向的所有其他对象。

shotgunNodesrifleNodes 都包含两个整数,代表关卡中放置我生成的拾音器的适当位置。

pickups 是一个 kpointers vector (父类),ShotgunPURiflePU 是派生类。我将在下面发布标题和来源。

奇怪的问题是,如果我打破代码,一次一个循环,一切似乎都很好。第一个枪支指针设置为指向步枪对象。美好的。然后将下一个枪支指针设置为指向下一个步枪对象,此时由于某种奇怪的原因, vector 中先前指向第一支步枪的指针被砍掉,现在只指向步枪的枪支部分对象,所以我失去了它的所有派生功能。

在循环结束时,我有一个指向 Gun Rifle Gun Shotgun 的枪 vector ,它应该是 Rifle Rifle Shotgun Shotgun。

int j = 0;

for (vec_i_sz i = 0; i < rifleNodes.size(); i++, j++)
{
riflePickups.push_back(RiflePU(agents, mesh));
riflePickups[i].Position(nodes[rifleNodes[i]].Position());

pickups.push_back(&riflePickups[i]);//point the pickup pointer to the rifle pickup
pickups[j]->Index(j);
pickups[j]->NodeIndex(rifleNodes[i]);
}

for (vec_i_sz i = 0; i < shotgunNodes.size(); i++, j++)
{
shotgunPickups.push_back(ShotgunPU(agents, mesh));
shotgunPickups[i].Position(nodes[shotgunNodes[i]].Position());

pickups.push_back(&shotgunPickups[i]);
pickups[j]->Index(j);
pickups[j]->NodeIndex(shotgunNodes[i]);
}

可能还值得注意的是,此代码(显然是翻译版本,但结构相同)适用于程序的 C# 版本。所以我怀疑这是代码的结构。关于指针的工作方式,有什么我不知道的吗?

这是在使用它们的 header 中声明 vector 的方式:

std::vector<Pickup*> pickups;
std::vector<RiflePU> riflePickups;
std::vector<ShotgunPU> shotgunPickups;

我只是通过写这篇文章注意到它们实际上并没有在循环运行之前(在构造函数的主体中)在初始化列表中初始化,但这不应该没问题吗,因为它们是类类型?

如果它们正在列表中初始化,它仍在发生。

pickups(std::vector<Pickup*>()),
riflePickups(std::vector<RiflePU>()),
shotgunPickups(std::vector<ShotgunPU>())

最佳答案

当您向 vector 添加项目时,push_back 可以在需要调整其底层缓冲区大小时使指向容器的所有指针无效。每次发生这种情况时,您已经存储在 pick_ups 中的指针都会变成垃圾。

1) 您可以预先为riflePickupsshotgunPickups 中的所有项目保留 内存。这将确保在添加许多项目时不会调整这些 vector 的大小,并且项目的地址将保持不变。

2) 您可以将指针存储在 pick_ups 之后您已经创建了两个 vector 中的所有项目,而不是在这些 vector 尚未达到其最终大小时。

3) 您可以对riflePickupsshotgunPickups 使用 vector std::list。在列表中,指向项目的指针只有在所述项目被删除时才会失效。


最后,您真的需要这些吗?也许您可以只在一个 vector 中存储(最好是智能)指向动态分配对象的指针。

关于c++ - 实例化怪异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8339411/

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