Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 迭代器错误中的向量迭代器_C++_Iterator_Stdvector_2d Games - Fatal编程技术网

C++ 迭代器错误中的向量迭代器

C++ 迭代器错误中的向量迭代器,c++,iterator,stdvector,2d-games,C++,Iterator,Stdvector,2d Games,为我的投资组合制作小行星游戏。游戏中遇到一个错误,使用下面的代码块。错误只是迭代器不可延迟,但我已经缩小了错误范围。在我向您展示代码之后,我将讨论这一点: void Game::Update() { if (elapsedTime > REFRESH_RATE) { player->Update(elapsedTime); std::vector<Asteroid*>::iterator iterator= bigAsteroids.begin();

为我的投资组合制作小行星游戏。游戏中遇到一个错误,使用下面的代码块。错误只是迭代器不可延迟,但我已经缩小了错误范围。在我向您展示代码之后,我将讨论这一点:

void Game::Update()
{
if (elapsedTime > REFRESH_RATE)
{
    player->Update(elapsedTime);

    std::vector<Asteroid*>::iterator iterator= bigAsteroids.begin();
    std::vector<Bullet*>::iterator iter = bullets.begin();

    // *********************** //
    while (iterator!= bigAsteroids.end())
    {
        if (*iterator != nullptr) // Checks to see if player is colliding with an asteroid and updates the asteroid
        {
            player->CheckCollisionsAsteroid( *iterator );

            // *********************** // Checks to see if bullet is colliding with asteroid 
            while (iter != bullets.end())
            {
                if (*iter != nullptr)
                {
                    if ((*iter)->CheckCollisionsAsteroid( **iterator ))
                    {
                        size_t i = iterator - bigAsteroids.begin();
                        iter = bullets.erase(iter);
                        iterator = bigAsteroids.erase(iterator);
                        printf("\nAsteroid destroyed at position %i", i);
                    }
                    else
                    {
                        ++iter;
                    }
                }
            }
            iter = bullets.begin(); // Reset the bullet iterator else we'd only get to check 1 asteroid

            // *********************** //
            if (*iterator != nullptr && iterator != bigAsteroids.end()) { (*iterator)->Update(elapsedTime); }
        }
        if (*iterator != nullptr && (iterator!= bigAsteroids.end()))
        {++iterator;}
    }
    // *********************** //
    Clock.Reset(); 
}
}
void Game::Update()
{
如果(elapsedTime>刷新率)
{
玩家->更新(elapsedTime);
std::vector::iterator iterator=bigstrobes.begin();
std::vector::iterator iter=bullets.begin();
// *********************** //
while(迭代器!=bigstrobes.end())
{
if(*iterator!=nullptr)//检查玩家是否与小行星碰撞并更新小行星
{
player->CheckCollisionsAsteroid(*迭代器);
//***********************检查子弹是否与小行星相撞
while(iter!=bullets.end())
{
如果(*iter!=nullptr)
{
if((*iter)->CheckCollisionsAsteroid(**迭代器))
{
size_t i=迭代器-bigstrobes.begin();
iter=子弹。擦除(iter);
迭代器=大小行星。擦除(迭代器);
printf(“\n在位置%i,i处销毁的甾体);
}
其他的
{
++iter;
}
}
}
iter=bullets.begin();//重置bullet迭代器,否则我们只能检查1颗小行星
// *********************** //
如果(*iterator!=nullptr&&iterator!=bigstrobes.end()){(*iterator)->更新(elapsedTime);}
}
if(*iterator!=nullptr&&(iterator!=bigstrobes.end())
{++迭代器;}
}
// *********************** //
时钟复位();
}
}
如果这一切看起来有点混乱,这里有一个简单的解释:

当迭代器通过每个小行星时,我检查播放器是否与每个小行星碰撞。目前这没有任何作用

然后我迭代我的子弹向量,检查每颗子弹与当前小行星的对比。如果发生碰撞,我将删除子弹和小行星,并打印出被摧毁的小行星在矢量中的位置

一旦我完成了,我就为下一颗小行星重置了bullet iter


目前我的主要问题是(*迭代器)调用更新问题是,当您销毁最后一颗小行星时,
迭代器
将设置为
bigstrobes.end()
(通过分配给
erase()
的结果)。然后在内部
while
循环终止后,取消对
迭代器的引用。无法取消对结束迭代器的引用

您必须切换支票的顺序:

if (iterator != bigAsteroids.end() && *iterator != nullptr)

如果你根据迭代器的引用来命名,例如,
itAsteroid
itBullet
@Angew,这将大大有助于代码的可读性哈哈,我一直在重写代码,所以目前在“iter”或“iterator”上键入Bulletter或Asteriter…:P最终版本将实现这些功能,谢谢。还有鲍勃,嗯。。我会再打给你的,谢谢你的帮助。这不是最后一颗小行星。这可能是我拍摄的第一颗小行星。如果它是矢量中的最后一颗小行星(如最后一颗小行星),则会抛出错误。我想我目前还没有找到一颗小行星去拍摄!HahaHe的意思是:当您调用
bigstrobes.erase(迭代器)
时,
iterator
设置为
bigstrobes.end()
<代码>*迭代器!=nullptr
将失败并且
迭代器!=bigstrobes.end()
将返回
false
,因此切换条件的顺序,您应该会很好。我懂了。我确实改变了它:
if(itAsteroid!=bigstrobes.end()){(*itAsteroid)->Update(elapsedTime);}
这仍然会导致错误。但是,我随后更改了下面的一行:
if(itAsteroid!=bigstrobes.end()&&&*itAsteroid!=nullptr){++itAsteroid;}
,它按照您所说的做了。我对你们做了什么:P谢谢你们两个!