如何删除对象引用

时间:2019-06-22 20:05:53

标签: c++ oop pointers game-development

我目前正在用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_ptrstd::shared_ptr这样的智能指针,但我忘记确保删除后这些指针应指向nullptr

0 个答案:

没有答案