C++ Ogre3d:迭代子节点错误

C++ Ogre3d:迭代子节点错误,c++,iteration,ogre,ogre3d,C++,Iteration,Ogre,Ogre3d,我有一个城市节点,其中包含许多建筑节点,每个节点我都希望授予一个新的子节点。这告诉房子他们有什么角色和标志。以后可用于其他功能。现在所有人都得到了相同的.mesh(稍后会做一个标记)来识别哪栋房子是什么。应随机分配。如果我尝试运行此命令,则会出现以下错误。我对食人魔很陌生,它增加了一些奇怪的代码 int CityManager::assignBuildingRole(Ogre::SceneNode*\u cityNode,int\u numberOfBuildings) { 标准::strin

我有一个城市节点,其中包含许多建筑节点,每个节点我都希望授予一个新的子节点。这告诉房子他们有什么角色和标志。以后可用于其他功能。现在所有人都得到了相同的.mesh(稍后会做一个标记)来识别哪栋房子是什么。应随机分配。如果我尝试运行此命令,则会出现以下错误。我对食人魔很陌生,它增加了一些奇怪的代码

int CityManager::assignBuildingRole(Ogre::SceneNode*\u cityNode,int\u numberOfBuildings)
{
标准::stringstream节点名称(“buildingRoleNode”);
Ogre::SceneNode::ChildNodeIterator cNode=\u cityNode->getChildIterator();
可分离的载体;
while(cNode.hasMoreElements()){
可分离。向后推((食人魔::场景节点*)cNode.getNext();
}
对于(int i=0;iattachObject(_signEntity);
打破
案例2:
_roleNode=(Ogre::SceneNode*)cNode.getNext()->createChild(nodename.str());
_signEntity=manager->createEntity(“Barrel.mesh”);
_roleNode->attachObject(_signEntity);
打破
案例3:
_roleNode=(Ogre::SceneNode*)cNode.getNext()->createChild(nodename.str());
_signEntity=manager->createEntity(“Barrel.mesh”);
_roleNode->attachObject(_signEntity);
打破
案例4:
_roleNode=(Ogre::SceneNode*)cNode.getNext()->createChild(nodename.str());
_signEntity=manager->createEntity(“Barrel.mesh”);
_roleNode->attachObject(_signEntity);
打破
违约:
打破
}
}
返回角色;
}

ChildNodeIterator
上调用
getNext
不仅会检索下一个元素,还会前进到下一个元素。请参见中的描述

因此,您要做的是迭代
\u cityNode
的子元素,并将每个子元素存储在
可分离的
向量中

while (cNode.hasMoreElements()) {
  detachable.push_back((Ogre::SceneNode *)cNode.getNext());
}
在这些行之后,您的
cNode
指向子列表的末尾(特别是在最后一个元素之后,如
std::map
中的
end()
,它是基础数据类型)

如果您试图进一步迭代它,您将得到一个错误

您可以在下一次迭代中使用
detaccable
(我想这就是您创建它的原因)

或者在while循环中创建子对象,并且根本不使用
detaccable

while (cNode.hasMoreElements()) {
  Ogre::SceneNode* curr = (Ogre::SceneNode *)cNode.getNext();
  switch (rand() % 5)
  {
  case 0:
    _roleNode = curr->createChild(nodename.str());
    _signEntity = manager->createEntity("Barrel.mesh");
    _roleNode->attachObject(_signEntity);
    break;
  /* ... */
  default:
    break;
  }
}

getNext
不仅检索下一个子节点,还推进迭代器。看看它。将它们更改为
peek nextvalue
可能会解决您的问题。另外,请参阅注释:“注意,返回的迭代器仅在没有从该节点添加或删除子节点的情况下有效”,这与任何stl迭代器的行为相同。这是否意味着我无法通过cityNode的子节点以这种方式添加额外节点?或者peekNextValue会解决这个问题吗?为什么不反复使用
可分离的
?只要调用
detaccable[i]->createChild
我就可以给出一个答案
_roleNode = detachable[i]->createChild(nodename.str());
while (cNode.hasMoreElements()) {
  Ogre::SceneNode* curr = (Ogre::SceneNode *)cNode.getNext();
  switch (rand() % 5)
  {
  case 0:
    _roleNode = curr->createChild(nodename.str());
    _signEntity = manager->createEntity("Barrel.mesh");
    _roleNode->attachObject(_signEntity);
    break;
  /* ... */
  default:
    break;
  }
}