我有一个问题,即指针向量似乎不以我期望的多态方式运行。陌生人是事实,它可以在它指向的所有其他对象上工作。

shotgunNodesrifleNodes都包含两个整数,它们代表一个级别中放置我正在生成的拾音器的适当位置。

pickups是kpointers(父类)的向量,并且ShotgunPURiflePU是派生类。我将在下面发布标题和源代码。

奇怪的问题是,如果我一次中断一次代码,就一切正常。第一个枪支指针设置为指向步枪对象。精细。然后将下一个枪支指针设置为指向下一个步枪对象,出于某种奇怪的原因,在该点上,矢量中应指向第一个步枪的前一个指针被削减,现在仅指向步枪的枪支部分对象,所以我失去了所有的派生功能。

在循环结束时,我有一个枪支向量,指向枪支步枪Gun弹枪,应该是步枪if弹枪Shot弹枪。

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#版本中有效。所以我怀疑这是代码的结构。关于指针的工作方式,我是否不了解?

向量是在使用它们的标头中声明的方式:

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


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

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

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

最佳答案

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

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

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

3)您可以对向量使用std::list来表示riflePickupsshotgunPickups。在列表中,仅当删除该项目时,指向项目的指针才会失效。



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

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

10-10 22:32