C++ 删除C+中的类对象+;

C++ 删除C+中的类对象+;,c++,C++,我正在控制台上做一个简单的僵尸岛游戏,我试图让僵尸在人类登陆时死去 为了创建僵尸,我使用了我的僵尸类,如下所示: Zombies *zombie = new Zombies[4]; 为了检查人类和僵尸是否在同一个地方,我使用了一个简单的for循环: int zombieCount = 4; for (int i = 0; i < 4; i++) { if (player.getPosX() == zombie[i].getPosX() && player.getP

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

为了创建僵尸,我使用了我的僵尸类,如下所示:

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

    }
}
int zombieCount=4;
对于(int i=0;i<4;i++)
{
如果(player.getPosX()==zombie[i].getPosX()&&player.getPosY()==zombie[i].getPosY())
{
僵尸计数--;
}
}

除了减少僵尸数量,我击中的僵尸应该从游戏中消失。如何做到这一点?

使用
向量
容器:

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--;
    }
}
僵尸僵尸模型;
std::vector zombieVec(10,zombieModel);
int zombieCount=zombieVec.size();
对于(int i=0;i
在C++11中,可以使用
std::remove(first,last,value)
删除数组中的某些元素。函数返回新的数组结尾,例如使用:

auto end = std::remove(std::begin(zombie), std::end(zombie), zombie[i]);
我建议使用
std::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();
std::向量僵尸;
//初始化僵尸。推回(某个僵尸);
for(vector::iterator it=zombies.begin();it!=zombies.end();/*no++it*/){
如果(player.getPosX()==it->getPosX()&&player.getPosY()==it->getPosY())
它=僵尸。擦除(它);
其他的
++它;
}
int zombieCount=zombies.size();

如果与lambda一起使用,则可以使用std::erase-remove\u,如下一行:

zombies.erase(std::remove_if(zombies.begin(), zombies.end(),
                  [& player](const Zombie& z){return player.getPosX() == z.getPosX() && player.getPosY() == z.getPosY();}),
              zombies.end());
假设您有一个
向量僵尸
列表
或另一个可以重新排序的容器。

NathanOliver在评论中建议使用
std::remove_if
——在我看来,这是迄今为止提出的最好的解决方案,不幸的是,这只是一个评论,因此我在这里说明了它的外观(仅通过比较X坐标略为缩短):

人p;
病媒僵尸(4);
自动结束=标准::删除\u如果
(
zombies.begin(),zombies.end(),
[&p](Zombie const&Zombie){return(Zombie.getPosX()==p.getPosX())&&(Zombie.getPosY()==p.getPosY());}
);
删除(end,zombies.end());

如果使用标准容器,这个问题会容易得多。例如,您可以使用
std::vector
,它允许您随意删除僵尸,并完全避免使用指针和手动内存管理。我将使用std::vector。您不能将僵尸I在网格外的位置/设置为空值,这样就不会再拾取它吗?@FLab假设我理解正确,这将导致内存泄漏。如果在最后执行delete[]zombie,则不是泄漏。但强迫自己跟踪新/删除配对是个坏主意。不要使用zombieCount,使用zombieVec.size()或使用
erase
remove\u if
和lambda。你可以简单地使用
std::vector::vector(size\t,Zombie)初始化。是否有任何方法可以在一行左右的代码中处理僵尸?因为如果我需要10个这样的代码,那就相当多了,因为我还必须生成并移动它们。@OanaFurtună我编辑了一行代码。多亏了FrançoisAndrieux
std::remove
返回新的理论迭代器结束,之后必须调用向量上的
erase
,使其丢弃经过迭代器的元素!因此,
zombie.erase(end,zombie.end())但它不是一个向量,它是一个新的僵尸[4],因此这与将僵尸与最后一个僵尸交换并执行--zombieCount没有区别,并且在最后缺少delete[]Zombie仍然是一个问题。如果直接擦除循环中的所有元素,你会做很多不必要的复制——如果僵尸应该留下来,你会选择两个迭代器,并将第二个迭代器复制到第一个迭代器。然后,您只能擦除向量的末尾。实际上,这就是你通过擦除(std:.remove[_if](…),end()
得到的结果。有效点是,对于给定的用例,我假设100个僵尸不太可能与玩家处于同一位置?@OanaNo,我在地图上同时最多有10个僵尸。