在C ++中删除一个类对象

时间:2017-03-14 14:03:48

标签: c++

我正在控制台做一个简单的僵尸岛游戏,我试图让僵尸在人类登陆时死亡。

为了创建僵尸,我使用了我的Zombie类:

Zombies *zombie = new Zombies[4];

为了检查人类和僵尸是否在同一个地方,我使用了一个简单的for循环:

int zombieCount = 4;
for (int i = 0; i < 4; i++)
{
    if (player.getPosX() == zombie[i].getPosX() && player.getPosY() == zombie[i].getPosY())
    {
        zombieCount--;

    }
}

除了减少zombieCount之外,我击中的僵尸应该从游戏中消失。我该怎么做?

4 个答案:

答案 0 :(得分:2)

在C ++ 11中,您可以使用std::remove(first, last, value)删除数组中的某些元素。该函数返回新的数组结尾,例如使用方法:

auto end = std::remove(std::begin(zombie), std::end(zombie), zombie[i]);

我建议使用std::vector这是一个适合您需求的动态数组。

参考文献:std::removestd::vector

建议的std :: vector示例:

std::vector<Zombies> zombies;
// init with zombies.push_back(someZombie);

for (vector<Zombies>::iterator it = zombies.begin(); it != zombies.end(); /*no ++it*/) {
  if (player.getPosX() == it->getPosX() && player.getPosY() == it->getPosY())
      it = zombies.erase(it);
  else 
      ++it;
}

int zombieCount = zombies.size();

答案 1 :(得分:1)

您可以将std :: erase-remove_if与lambda一起使用,如下面的单行:

zombies.erase(std::remove_if(zombies.begin(), zombies.end(),
                  [& player](const Zombie& z){return player.getPosX() == z.getPosX() && player.getPosY() == z.getPosY();}),
              zombies.end());

假设您有vector<Zombie> zombieslist<Zombie>或其他可以重新排序的容器。

答案 2 :(得分:0)

使用vector容器:

Zombies zombieModel;

std::vector<Zombies> zombieVec(10, zombieModel);

int zombieCount = zombieVec.size();
for (int i = 0; i < zombieVec.size(); i++)
{
    if (player.getPosX() == zombieVec[i].getPosX() && player.getPosY() == zombieVec[i].getPosY())
    {
        zombieCount--;
        zombieVec.erase(zombieVec.begin()+i);
        i--;
    }
}

答案 3 :(得分:0)

NathanOliver在评论中建议使用NaN - 在我眼中最好的是迄今为止提出的解决方案,不幸的是它只是一个评论,所以我在这里说明它是什么样的(稍微缩短一下,比较X-坐标...):

std::remove_if