生命的游戏,C++-多态数组(也许还有指针)
Game of Life, C++ - Polymorphic Array (And maybe Pointers)
我在处理多态性的一些代码时遇到了问题。
本质上,我要制作一个《生命的游戏》,因此我有一个驱动程序,在那里我创建了一个有机指针网格(从超级类到实际动物类,在本例中是蚂蚁)。
在我的驱动程序中,我使用以下代码在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],然后稍后在上设置
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- QMetaObject invokeMethod的基于函数指针的语法
- 如何从 std::atomic 中提取指针 T<T>?
- 如何在 C# 中映射双 C 结构指针?
- C++将浮点指针值舍入为小数位数
- 为什么++(*p)更改指针值
- 调整大小后指向元素值的指针unordered_map有效?
- 正在将指针转换为范围
- 使用指向成员的指针将成员函数作为参数传递
- 生命的游戏,C++-多态数组(也许还有指针)
- 也许有人可以看到我缺少什么(调试案例、C++、函数指针)