对象在C ++ vector <object *> </object *>中变为null

时间:2014-01-16 14:27:36

标签: c++ pointers vector null

我正在使用C ++开发游戏,并拥有一个玩家对象和一个子弹对象。我有两种对象的std :: vector集合,在我的代码中先前定义如下:

std::vector<Player*> players;
std::vector<Bullet*> bullets;

我的问题发生在我的主游戏循环中,我在那里执行所有更新逻辑。使用for循环检查每个玩家并更新他,我得到他产生的任何子弹并将它们添加到子弹矢量。

    // update players
    for (int i = 0; i < players.size(); ++i){
        Player *player = players[i];
        player->Update(delta);
        // get bullets
        for (int b = 0; b < player->Bullets.size(); ++b){
            // THIS IS WHERE THINGS GET WEIRD FOR PLAYER 2
            Bullet *bull = player->Bullets[i];
            bullets.push_back(bull);
        }
        player->Bullets.clear();
    }

虽然我的第一个玩家工作得很好 - 他可以随心所欲地射击 - 当你到达第二个玩家时,让他射击会在我迭代子弹矢量时导致EXC_BAD_ACCESS。当我使用调试器(使用Xcode)时,当我到达我的注释下面的部分时(“//这就是玩家2的所有内容”),我注意到子弹为NULL且播放器为NULL同样。在调用该玩家的更新方法和我将子弹拉出的地方之间,事情发生了可怕的错误。

我现在已经调试了好几个小时了,我想知道我错过了什么。

谢谢!

1 个答案:

答案 0 :(得分:4)

这是一个简单的错字:

Bullet *bull = player->Bullets[b];
                               ^ not i 

使用基于范围的循环(C ++ 11或更高版本)可以避免这种错误:

for (Player * player : players) {
    player->Update(delta);
    for (Bullet * bullet : player->Bullets) {
        bullets.push_back(bullet);
    }
    player->Bullets.clear();
}

和/或用

替换内循环
bullets.insert(bullets.end(), player->Bullets.begin(), player->Bullets.end());