我目前正在用C ++创建一个类似roguelike的2d游戏。在我的代码中,我决定使用单元格网格来表示地牢的地板。
#include <array>
const int MAX_H = 40;
const int MAX_W = 70;
class Grid{
private:
std::array<std::array<Cell *,MAX_H>,MAX_W> m_cells;
public:
Grid();
~Grid();
void resetGrid();
void placeCharacter(Character * character, int x, int y);
void placeItem(Item * item, int x, int y);
void placeTile(Tile * tile, int x, int y);
};
网格构造器:
Grid::Grid(){
for(int i = 0; i<MAX_H; i++)
{
for(int j = 0; j<MAX_W; j++)
{
m_cells[i][j]=new Cell(i,j);
}
}
}
一个单元格表示如下:
class Cell{
private:
Cell() = default;
Character* m_character=nullptr;
Item* m_item=nulltpr;
Tile* m_tile=nullptr;
int x;
int y;
public:
bool setCharacter(Character *);
bool setItem(Item *item);
bool setTile(Tile *tile);
Character *getCharacter();
Item * getItem();
Tile *getTile();
};
每个单元实例可以包含一个Item实例,一个Character实例或一个Tile实例。 在我的main.cpp中,使用以下说明:
Grid g;
Item * spear = new Item();
Tile * trap = new Tile();
g->placeItem(spear,5,5);
g->placeTile(trap,4,5);
我想要的是,当我改变地板时,删除网格上所有的物品和瓷砖。因此,此功能是我的第一个解决方案:
void Grid::resetGrid()
{
for (int i = 0; i < MAX_W + 1; i++)
{
for (int j = 0; j < MAX_H + 1; j++)
{
Cell * cell = m_grid[i][j];
if(cell->getItem()!=nullptr)
{
delete cell->getItem();
}
if(cell->getTile()!=nullptr)
{
delete cell->getTile();
}
}
}
在resetGrid()方法时,这给我带来了两次释放或无效的指针错误。我知道这可能是由于“矛”和“陷阱”是以特定方式创建的,但是我对带有对象的c ++指针缺乏很好的启示。 如果有人有想法,请随时发布答案。
编辑
正如用户指出的那样,删除后我忘记将项目和图块设置为nullptr
。我了解,虽然我使用的是指针,而不是像std::unique_ptr
或std::shared_ptr
这样的智能指针,但我忘记确保删除后这些指针应指向nullptr