列出迭代器而不是可取消引用的运行时



>我在运行时收到此错误 表达式:列表迭代器不可取消引用。 下面是我正在使用的代码。

头文件

//-----------------------------------------------------------------------------
//
//  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;
}

任何帮助告诉我如何解决这个问题将不胜感激谢谢你

另外,错误究竟意味着什么以及它是如何/何时发生的

您在此处初始化curBot

void Fletcher_TargetingSystem::Update()
{
    // ...
    curBot = SensedBots.begin();
    // ...
}

但是您似乎没有在任何地方拨打Update(),因此在此行中:

for (curBot; curBot != SensedBots.end(); ++curBot)
{ // ... }

您正在尝试使用未初始化的迭代器,该迭代器不可取消引用,如错误消息所示。

解决方案:在使用前初始化curBot

旁注:为什么curBot在全球范围内声明?在您实际使用它的地方(即在for循环中(声明/初始化它会更有意义。

你把全局化:

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() make curBot=SensedBots.begin();也有可能调用pickTarget() 2 次,并且SensedBots两者之间的大小发生了变化,使 endlich 第一次调用值无效,curBot= SensedBots.end();第二次输入 for 循环时带有"falch"值。

最新更新