我在运行时表达式上遇到此错误:列出迭代器而不是dereferencable。下面是我正在使用的代码。
头文件
//-----------------------------------------------------------------------------
//
// Name: Fletcher_TargetingSystem.h
//
// Author: Alan Fletcher (20040797)
//
// Desc: class to select a target from the opponents currently in a bot's
// perceptive memory.
//-----------------------------------------------------------------------------
#include "2d/Vector2D.h"
#include <list>
#include "../../AbstTargetingSystem.h"
class AbstRaven_Bot;
class Fletcher_TargetingSystem : public AbstTargetingSystem
{
public:
Fletcher_TargetingSystem(AbstRaven_Bot* owner);
//each time this method is called the opponents in the owner's sensory
//memory are examined and the closest is assigned to m_pCurrentTarget.
//if there are no opponents that have had their memory records updated
//within the memory span of the owner then the current target is set
//to null
void Update();
void closestBotStrategy();
void setCurrentTarget(AbstRaven_Bot* t);
AbstRaven_Bot* getCurrentTarget();
void setCurrentOwner(AbstRaven_Bot* t);
AbstRaven_Bot* getCurrentOwner();
};
class Fletcher_getClosestBotStrategy
{
public:
Fletcher_getClosestBotStrategy()
{}
Fletcher_getClosestBotStrategy(AbstRaven_Bot* owner);
//each time this method is called the opponents in the owner's sensory
//memory are examined and the closest is assigned to m_pCurrentTarget.
//if there are no opponents that have had their memory records updated
//within the memory span of the owner then the current target is set
//to null
void pickTarget(AbstRaven_Bot& owner);
};
#endif
c ++文件
#include "Fletcher_TargetingSystem.h"
#include "../../AbstRaven_Bot.h"
#include "../../Raven_SensoryMemory.h"
#include "../../Debug/DebugConsole.h"
//-------------------------------- ctor ---------------------------------------
//-----------------------------------------------------------------------------
Fletcher_TargetingSystem::Fletcher_TargetingSystem(AbstRaven_Bot* owner):
AbstTargetingSystem(owner){
}
//-------------------------------- ctor ---------------------------------------
//-----------------------------------------------------------------------------
Fletcher_getClosestBotStrategy::Fletcher_getClosestBotStrategy(AbstRaven_Bot* owner){
}
std::list<AbstRaven_Bot*> SensedBots;
std::list<AbstRaven_Bot*>::const_iterator curBot;
//----------------------------- Update ----------------------------------------
//-----------------------------------------------------------------------------
//----------------------------- closestPlayer ----------------------------------------
//-----------------------------------------------------------------------------
void Fletcher_getClosestBotStrategy::pickTarget(AbstRaven_Bot& owner)
{
double ClosestDistSoFar = MaxDouble;
Fletcher_TargetingSystem *fTS = new Fletcher_TargetingSystem(&owner);
for (curBot; curBot != SensedBots.end(); ++curBot)
{
//make sure the bot is alive and that it is not the owner
if ((*curBot)->isAlive() && (*curBot != fTS->getCurrentOwner()) )
{
double dist = Vec2DDistanceSq((*curBot)->Pos(), fTS->getCurrentOwner()->Pos());
if (dist < ClosestDistSoFar)
{
ClosestDistSoFar = dist;
fTS->setCurrentTarget(*curBot);// = *curBot;
}
}
}
//return *fTS;
}
void Fletcher_TargetingSystem::Update()
{
// currentStrategy = targetClosestBotStrategy;
// target = currentStrategy.pickTarget();
//std::list<AbstRaven_Bot*> SensedBots;
SensedBots = getCurrentOwner()->GetSensoryMem()->GetListOfRecentlySensedOpponents();
curBot = SensedBots.begin();
//std::list<AbstRaven_Bot*>::const_iterator curBot = SensedBots.begin();
setCurrentTarget(0);// = 0;
Fletcher_getClosestBotStrategy* fGCBS = new Fletcher_getClosestBotStrategy(this->getCurrentOwner());
fGCBS->pickTarget(**curBot);
}
AbstRaven_Bot* Fletcher_TargetingSystem::getCurrentOwner(){
return m_pOwner;
}
AbstRaven_Bot* Fletcher_TargetingSystem::getCurrentTarget(){
return m_pCurrentTarget;
}
void Fletcher_TargetingSystem::setCurrentTarget(AbstRaven_Bot* t){
m_pCurrentTarget = t;
}
void Fletcher_TargetingSystem::setCurrentOwner(AbstRaven_Bot* t){
m_pOwner = m_pOwner;
}
任何帮助告诉我如何解决这个问题将不胜感激 感谢你
此外,错误究竟是什么意思以及如何/何时发生
答案 0 :(得分:0)
您在这里初始化curBot
:
void Fletcher_TargetingSystem::Update()
{
// ...
curBot = SensedBots.begin();
// ...
}
但你似乎没有在任何地方拨打Update()
,所以在这一行:
for (curBot; curBot != SensedBots.end(); ++curBot)
{ // ... }
您正在尝试使用未初始化的迭代器,该错误消息指示不可取消引用。
解决方案:在使用之前初始化curBot
。
旁注:为什么curBot
在全球范围内宣布?在实际使用它的地方声明/初始化它会更有意义,即for
循环。
答案 1 :(得分:0)
你将全局化:
std::list<AbstRaven_Bot*>::const_iterator curBot;
仅在Update()内使用:
SensedBots = getCurrentOwner()->GetSensoryMem()
->GetListOfRecentlySensedOpponents();
curBot = SensedBots.begin();
您可以在其他地方更改SensedBots
(例如更改为其他getCurrentOwner()->GetSensoryMem()->GetListOfRecentlySensedOpponents();)
而不设置curBot
,从而使previus值无效。
通常你会这样做:
for (curBot=SensedBots.begin(); curBot != SensedBots.end(); ++curBot)
即使您拨打Update()
拨打curBot=SensedBots.begin();
,也可以拨打pickTarget()
2次,SensedBots
改变大小,使endlich优先呼叫失效 - curBot= SensedBots.end();
的值 - 以“falch”值进入for循环的第二次。