【问题标题】:Game of Life, C++ - Polymorphic Array (And maybe Pointers)生命游戏,C++ - 多态数组(也许还有指针)
【发布时间】:2013-12-05 21:37:17
【问题描述】:

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

基本上我要做一个生命游戏,因此有一个驱动程序,我在其中创建有机体指针网格(实际动物类的超类,在本例中为 Ant)。

在我的驱动程序中,我使用以下代码在有机体指针数组中创建了一个新 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 类中用于 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);
}

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

【问题讨论】:

  • 分享AntOrganism的类定义。
  • 你能提供一个SSCCE吗?
  • 您向我们展示的代码中该错误的唯一可能来源是world 可能未初始化或NULLspawnX/spawnY 超出范围。跨度>
  • 继续@Casey 的评论:spawnX/spawnY 可能超出范围,因为您没有在 [DRIVER] 中创建的蚂蚁上调用 SetPosition,而 @987654335 @function 表明您的实现需要这样做。
  • 更新了我希望是 SSCCE 的内容——话虽如此,有问题的代码似乎与 World 类的 setOrganism 相关。 setPosition 只是 Ant 中的 a 属性,所以它知道它在哪里,在这种情况下,我只是硬编码了用于测试的值,所以这不应该成为问题

标签: c++ pointers inheritance polymorphism


【解决方案1】:

您尚未显示Organism 的定义,但从您的cmets 来看,我认为它有一个成员World *world。您将World *world 传递给Ant 的构造函数,但您没有将它用于任何事情;您没有在任何地方分配它,也没有调用Organism 的任何非默认构造函数。这意味着成员 world 很可能未初始化。

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

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

【讨论】:

  • 无法透过树木看到森林——非常感谢!我确实忘记将有机体的世界指针分配给传入的那个-doi:p
【解决方案2】:

您没有声明网格的类型。你只有 grid[x][y] = null;你应该把它设置为有机网格[x][y],然后再设置它

【讨论】:

  • 嗯,grid 很可能是World 的成员,所以它可能在World.h 中定义。
猜你喜欢
  • 1970-01-01
  • 2013-02-15
  • 2013-12-01
  • 1970-01-01
  • 2012-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多