簡體   English   中英

迭代器錯誤內的向量迭代器

[英]Vector Iterator within an iterator error

正在為我的投資組合開發小行星游戲。 使用以下代碼塊在錯誤中進行游戲。 錯誤很簡單,因為迭代器是不可延遲的,但是我縮小了范圍。 在向您展示代碼之后,我將討論這一點:

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(); 
}
}

如果看起來有些混亂,這里有一個簡短的解釋:

當迭代器穿過每個小行星時,我檢查玩家是否正在與每個小行星碰撞。 目前,這無能為力

然后,我遍歷子彈向量,並對照當前的小行星檢查每個子彈。 如果發生碰撞,我將消滅子彈和小行星,並打印出被摧毀的小行星在矢量中的位置。

完成此操作后,我將重置下一個小行星的項目符號迭代器。

我目前的主要問題是(* iterator)<-小行星對Update的調用。

僅當我擦除小行星向量中的最后一個物體時,該問題才會出現。 我知道擦除會向下一個對象返回一個迭代器-如果下一個對象不存在,則會引發錯誤(因為迭代器然后指向nullptr,對嗎?)。 我正在檢查nullptr無濟於事。

是否有人可以提供任何建議或幫助? 非常感謝,,了好幾個小時!

問題是,當銷毀最后一個小行星時, iterator將設置為bigAsteroids.end() (通過分配給erase()的結果)。 然后,在內部while循環終止之后,您將取消引用iterator 過去的迭代器無法取消引用。

您必須切換檢查順序:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM