生命的游戏,C++-多态数组(也许还有指针)

Game of Life, C++ - Polymorphic Array (And maybe Pointers)

本文关键字:也许 指针 数组 游戏 C++- 多态 生命      更新时间:2023-10-16

我在处理多态性的一些代码时遇到了问题。

本质上,我要制作一个《生命的游戏》,因此我有一个驱动程序,在那里我创建了一个有机指针网格(从超级类到实际动物类,在本例中是蚂蚁)。

在我的驱动程序中,我使用以下代码在Organism指针数组中创建了一个新的Ant:

[DRIVER]
Ant *ant = new Ant(&world, GRID_HEIGHT, GRID_WIDTH);
world.setOrganism(ant,4,4); 

在这里,我创建了一个指向Ant的指针,并将其放入世界中。下面是setOrgamism函数:

[World]
void World::setOrganism(Organism *organism, int x, int y)
{   grid[x][y] = organism; }

因此,当从驱动程序调用时,此代码可以工作。我可以在任何地方用这个做一只新蚂蚁,没有问题。

然而,当我试图在Ant的spawn函数中运行它时,我遇到了一个访问违规错误,我的程序在执行setOrganism时崩溃。

以下是我的Ant类中用于生成函数的代码:

[Ant]
void Ant::spawn(int spawnX, int spawnY)
{
     Ant *newAnt = new Ant(world, GRID_HEIGHT, GRID_WIDTH);
     newAnt->setPosition(spawnX,spawnY);
     world->setOrganism(newAnt, spawnX, spawnY);
}

我们非常感谢您的帮助!

编辑:

[World.cpp]
#include "World.h"
#include "Ant.h"
#include "Lion.h"
using namespace std;
World::~World(void)
{
}
World::World(void)
{
    for(int y = 0; y < GRID_HEIGHT; y++)
    {
        for(int x = 0; x < GRID_WIDTH; x++)
        {
            grid[x][y] = NULL;
        }
    }
}
Organism* World::getOrganism(int x, int y)
{
    return grid[x][y];
}
void World::setOrganism(Organism *organism, int x, int y)
{
    grid[x][y] = organism;
    organism->setPosition(x,y);
}

_

[Ant]
#include "Ant.h"
using namespace std;
Ant::~Ant(void)
{
}
Ant::Ant(void)
{
}
Ant::Ant(World *world, int width, int height)
{
    srand(time(NULL));
    this->width = width;
    this->height = height;
}
void Ant::spawn(int spawnX, int spawnY)
{
    Ant *newAnt = new Ant(world, GRID_HEIGHT, GRID_WIDTH);
    newAnt->setPosition(spawnX,spawnY);
    world->setOrganism(newAnt, spawnX, spawnY);
}

_

[Driver]
#include "Organism.h"
#include "Ant.h"
#include "Lion.h"
#include "World.h"
using namespace std;
int main()
{
    World *world = new World();
    //This works
    Ant *ant = new Ant(world, GRID_HEIGHT, GRID_WIDTH);
    world->setOrganism(ant,4,4);
    //This does not
    ant->spawn(6,6);
}

如果您需要更多信息,请询问!

您还没有显示Organism的定义,但根据您的评论,我认为它有一个成员World *world。您正在将World *world传递到Ant的构造函数中,但没有将其用于任何用途;您没有将其分配到任何位置,也没有调用Organism的任何非默认构造函数。这意味着成员world很可能未被初始化。

这反过来意味着在Ant::spawn内部,world(指this->world)要么是空指针,要么是垃圾值(取决于Organism的默认构造函数如何初始化其world成员)。当取消引用时,这两种情况中的任何一种都会导致访问违规——这正是你所得到的。

要解决这个问题,请确保Ant的构造函数以某种方式初始化world成员——可能是通过将world参数传递给Organism的适当构造函数。

您没有声明网格的类型。您只需要grid[x][y]=null;您应该将其设置为Organism网格[x][y],然后稍后在上设置