我遇到了一些处理多态性问题的代码。
基本上我是要制作一个生命游戏,因此有一个驱动程序,我创建一个有机体指针网格(超级类到实际的动物类,在这种情况下,Ant)。
在我的驱动程序中,我使用以下代码在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函数中运行它时,我收到了一个Access Violation错误,我的程序崩溃了执行setOrganism。
这是我的Ant类中用于spawn函数的代码:
[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);
}
如果您需要更多信息,请询问!
答案 0 :(得分:2)
您尚未显示Organism
的定义,但是根据您的评论,我认为它有一个成员World *world
。您将World *world
传递给Ant
的构造函数,但您没有将其用于任何事情;你没有在任何地方分配它,你也没有调用Organism
的任何非默认构造函数。这意味着成员world
很可能未被初始化。
这反过来意味着在Ant::spawn
内,world
(指this->world
)是空指针或垃圾值(取决于{{1的默认构造函数)初始化其Organism
成员)。这些中的任何一个都会在取消引用时导致访问冲突 - 正是你得到的。
要解决此问题,请确保world
的构造函数以某种方式初始化Ant
成员 - 可能是将world
参数传递给world
的相应构造函数。 / p>
答案 1 :(得分:0)
你没有声明网格的类型。你只需要grid [x] [y] = null;你应该把它设置为有机体网格[x] [y],然后在
上设置它