多态性不能正常工作

Polymorphism doesn't work as it should

本文关键字:工作 常工作 不能 多态性      更新时间:2023-10-16

我花了几个小时来寻找这个错误,现在至少我知道问题出在哪里,但我不知道为什么。

所以我有:

std::vector< std::vector <Organism* > >world;

我有基类Organism和子类BeetleAnt

在基类Organism中,我有虚函数:

    private:
         bool energy;
    public:
    Organism():energy(true){}
    virtual void removeEnergy(){
        energy = false;
    }
    virtual bool hasEnergy(){
        return energy;
    }
    virtual void resetEnergy(){
        energy = true;
    }

而且我没有在任何子类中覆盖它们。我在子类中调用了基类构造函数。

当我调用此函数时:

void World::replaceOrganism(int x, int y, int newX, int newY){  
        world[newX][newY] = world[x][y];
        world[x][y] = new Organism;
        world[newX][newY]->removeEnergy(); // this line
}

它仅从此类对象中删除能量。这意味着如果在向量world中有多个甲虫,那么通过以下行:

world[newX][newY]->removeEnergy();

能量从所有这些中移除。

我认为这是与向量有关的东西。有人有什么建议吗?如果您需要更多信息 ->评论我会添加。

如果我删除该行,还有一件事:

world[newX][newY]->removeEnergy();

然后Organism类对象或其子对象的能量不会改变。

编辑

创建世界矢量:

world.resize(worldSizeX);
    for (int x = 0; x < worldSizeX; x++){
        world[x] = std::vector< Organism* >(worldSizeY);
        // INITATES world ARRAY
        for (int y = 0; y < worldSizeY; y++){
            world[x][y] = new Organism;
        }
        // !INITATES world ARRAY
    }

编辑

更改 replaceOrganism 函数:

void World::replaceOrganism(int x, int y, int newX, int newY){  
        delete world[newX][newY];   
        world[newX][newY] = world[x][y];
        delete world[x][y];
        world[x][y] = new Organism;
 }

删除 word[newX][newY] 指向的所有类对象,但函数只调用一次。

编辑

将类对象替换为其子对象的函数Organism

bool World::createOrganism(int x, int y, Organism* organism){
    Organism* empty = new Organism;
    if (world[x][y]->type() != empty->type()){
        delete empty;
        return false;
    }
    else{
        delete empty;
        world[x][y] = organism;
        return true;
    }
}

我这样称呼它:

createOrganism(2,3,new Beetle);

编辑

void World::generateOrganisms(Organism* organism, int amount){
    while (amount != 0){
        int x = rand() % worldSizeX;
        int y = rand() % worldSizeY;
        if (createOrganism(x, y, organism)){
            amount--;
        }
    }
}

一切都指向同一个对象。

generateOrganisms(Organism* organism, int amount)你设置的所有几个指针都指向同一个生物体。 所以都是同样的甲壳虫。

您需要预见您的有机体的附加虚拟功能:

Organism *clone()  {
   // create a new organism of the same type 
   }   

应该为每个子函数覆盖这个虚函数,以使用正确的构造函数创建一个新的有机体。

然后,您可以更新创建函数:

bool World::createOrganism(int x, int y, Organism* organism){
    Organism* empty = new Organism;
    if (world[x][y]->type() != empty->type()){
        delete empty;
        return false;
    }
    else{
        delete empty;
        world[x][y] = organism->clone();  // use a clone, not the original
        return true;
    }
}

此外,我不确定是否根据需要删除所有未使用的对象(至少,仅使用您提供的狙击手很难说(。 可能值得调查shared_ptr的潜在用途,以避免泄漏内存。