gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:10:53 24 4
gpt4 key购买 nike

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

基本上我要制作一个生命游戏,因此我有一个驱动程序,我在其中创建一个有机体指针网格(实际动物类的父类(super class),在本例中为 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 ,没问题。

但是,当我尝试在 Ant 的 spawn 函数中运行它时,出现访问冲突错误并且我的程序在执行 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);
}

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

最佳答案

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

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

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

关于c++ - 生命游戏,C++ - 多态数组(也许还有指针),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20411286/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com