所以这是交易。 我这里有一个容器类,
#include "stdafx.h"
#include "ObjectManager.h"
#include "Game.h"
ObjectManager::ObjectManager()
{
}
ObjectManager::~ObjectManager()
{
std::for_each(_objects.begin(),_objects.end(),ObjectDeallocator());
std::for_each(_dynamicObjects.begin(),_dynamicObjects.end(),DynamicObjectDeallocator());
}
void ObjectManager::Add(std::string name, VisibleGameObject *object)
{
_objects.insert(std::pair<std::string, VisibleGameObject*>(name,object));
}
void ObjectManager::Remove(std::string name)
{
std::map<std::string, VisibleGameObject*>::iterator results = _objects.find(name);
if (results != _objects.end())
{
delete results->second;
_objects.erase(results);
}
}
int ObjectManager::GetObjectCount() const
{
return _objects.size();
}
VisibleGameObject* ObjectManager::Get(std::string name) const
{
std::map<std::string, VisibleGameObject*>::const_iterator results = _objects.find(name);
if (results == _objects.end())
return NULL;
return results->second;
}
void ObjectManager::AddDynamic(VisibleGameObject *object)
{
_dynamicObjects.push_back(object);
}
void ObjectManager::PostRemoveDynamic()
{
std::vector<VisibleGameObject*>::const_iterator iter = _dynamicObjects.begin();
while(iter != _dynamicObjects.end())
{
if ((*iter)->IsDeleted())
{
delete (*iter);
_dynamicObjects.erase(iter);
}
iter++;
}
}
const std::vector<VisibleGameObject*>& ObjectManager::GetDynamicContainer()
{
return _dynamicObjects;
}
void ObjectManager::DrawAll(sf::RenderWindow& renderWindow)
{
std::map<std::string, VisibleGameObject*>::const_iterator itr = _objects.begin();
while(itr != _objects.end())
{
itr->second->Draw(renderWindow);
itr++;
}
std::vector<VisibleGameObject*>::const_iterator iter = _dynamicObjects.begin();
while(iter != _dynamicObjects.end())
{
(*iter)->Draw(renderWindow);
iter++;
}
}
void ObjectManager::UpdateAll()
{
std::map<std::string, VisibleGameObject*>::const_iterator itr = _objects.begin();
std::vector<VisibleGameObject*>::iterator iter;
iter = _dynamicObjects.begin();
float timeDelta = GameEngine::GetWindow().GetFrameTime();
while(itr != _objects.end())
{
itr->second->Update(timeDelta);
itr++;
}
while(iter != _dynamicObjects.end())
{
(*iter)->Update(timeDelta);
iter++;
}
}
并且,使用断点,我已经确定问题在于此函数,
void ObjectManager::UpdateAll()
{
std::map<std::string, VisibleGameObject*>::const_iterator itr = _objects.begin();
std::vector<VisibleGameObject*>::iterator iter;
iter = _dynamicObjects.begin();
float timeDelta = GameEngine::GetWindow().GetFrameTime();
while(itr != _objects.end())
{
itr->second->Update(timeDelta);
itr++;
}
while(iter != _dynamicObjects.end())
{
(*iter)->Update(timeDelta);
iter++;
}
}
具体来说,这一行,
(*iter)->Update(timeDelta);
我的互联网搜索没有得出答案,所以现在我问你是什么造成了这个故障。如果有人需要看到它,我也会发布标题。另外,这是一个在线教程修改过的课程。
编辑:错误消息来自vectors类中的内置断言。(表达式:向量迭代器不兼容)
答案 0 :(得分:0)
好吧,经过一段时间的睡眠,我发现了它。作为对其他人的警告,问题来自正在更新的一个对象,在定义迭代器后创建一个新的动态对象,使其无效。一旦我可以进入计算机,我会编辑一些解释此代码的代码。