В настоящее время я создаю небольшую игру в жанре roguelike на C ++.В своем коде я решил изобразить пол подземелья, используя сетку ячеек.
#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();
};
Каждый экземпляр Cell может содержать экземпляр 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
после удаления