对象的 C++ 实例无法读取内存
C++ Instance of object Unable to Read memory
我需要一些有关 C++ 和 objects\references\pointers 的帮助。我正在编写一个简单的国际象棋程序,其中包含多个 classes。特别是我对以下两个 classes Board 和 Cell 有疑问:
棋盘有一个由单元格向量组成的向量(基本上是一个矩阵)。每个单元格都有一个指向当前占据它的部分的指针。
class Board
{
public:
Board();
void drawBoard();
bool makeMove(int startRow, int startCol, int destRow, int destCol);
private:
vector< vector<Cell> > _board;
void initBoard();
void initPieces();
};
Board::Board()
{
initBoard();
}
void Board::initBoard()
{
for (int i = 0; i < BOARD_SIZE; i++)
{
vector<Cell> row; //create empty row
for (int j = 0; j < BOARD_SIZE; j++)
{
row.push_back((Cell(i, j)));
}
_board.push_back(row);
}
initPieces();
}
void Board::initPieces()
{
//Set Pawns
for (int i = 0; i < BOARD_SIZE; i++)
{
_board[1][i].setOccupying(new Pawn(White));
_board[6][i].setOccupying(new Pawn(Black));
}
}
void Board::drawBoard()
{
drawLettersCoord();
for (int i = BOARD_SIZE-1; i >= 0; i--)
{
std::cout << i + 1 << " ";
for (int j = 0; j < BOARD_SIZE; j++)
{
_board[i][j].draw();
}
std::cout << " " << i + 1 << std::endl;
}
std::cout << "\n";
}
bool Board::makeMove(int startRow, int startCol, int destRow, int destCol)
{
_board[startRow][startCol].getOccupyingPiece()->isLegalMove(
startRow, startCol, destRow, destCol);
return true;
}
这是单元格 class:
class Cell
{
public:
Cell();
Cell(int row, int col);
Cell(int row, int col, ChessPiece * occupying);
void draw();
ChessPiece * getOccupyingPiece();
void setOccupying(ChessPiece *occupying);
private:
int _row;
int _col;
bool _occupied;
ChessPiece * _pieceOccupying;
};
Cell::Cell()
:Cell(0, 0)
{
setColour();
}
Cell::Cell(int row, int col)
: _row(row), _col(col), _occupied(false)
{
setColour();
}
Cell::Cell(int row, int col, ChessPiece * occupying)
: _row(row), _col(col), _pieceOccupying(occupying), _occupied(true)
{
setColour();
}
void Cell::setOccupying(ChessPiece *occupying)
{
_occupied = true;
_pieceOccupying = occupying;
}
void Cell::draw()
{
int foregroundText;
if (!_occupied)
{
foregroundText = 37;
}
else
{
foregroundText = _pieceOccupying->getPlayer();
}
cout << "[" << foregroundText << ";" << _colour << "m"
<< (_occupied ? _pieceOccupying->getPieceCode(): " ") << "[0m";
}
ChessPiece * Cell::getOccupyingPiece()
{
return _pieceOccupying;
}
当我运行游戏时,我通过调用
创建并绘制了一个新的 Board
Board _board;
_board.drawBoard();
绘图似乎工作正常,没有任何问题。
但是,当我调用
_board.makeMove(1,0,2,0);
为了检查棋子是否可以走这样的一步,我得到了一个内存错误。调试后,我看到被调用的 Cell 对象中有垃圾,而不是实际数据。当我试图查看指向占用块的指针时,它显示 "Unable To Read Memory",因此当我调用占用块的 isLegalMove 函数时,它崩溃了。
我似乎无法找出问题所在。我不明白为什么矢量内的单元格中会有垃圾,它是在 class 中定义的(没有新的)所以根据我的理解,只要当前的板实例是,它就应该可用活着。
任何人都可以阐明我做错了什么吗?
并非 Cell
的所有构造函数都初始化 _occupied
和 _pieceOccupying
,这意味着它们在某些 Cell
对象中可能具有垃圾值。
此外,您的 makeMove
无条件取消引用 getOccupyingPiece()
- 它不检查空值。
最后,你的棋盘上只有棋子,这意味着 (0, 0)
不包含棋子 - 因为 1.,Cell
对象包含垃圾值在其 _pieceOccupying
中,因此您访问随机内存并崩溃。
我需要一些有关 C++ 和 objects\references\pointers 的帮助。我正在编写一个简单的国际象棋程序,其中包含多个 classes。特别是我对以下两个 classes Board 和 Cell 有疑问:
棋盘有一个由单元格向量组成的向量(基本上是一个矩阵)。每个单元格都有一个指向当前占据它的部分的指针。
class Board
{
public:
Board();
void drawBoard();
bool makeMove(int startRow, int startCol, int destRow, int destCol);
private:
vector< vector<Cell> > _board;
void initBoard();
void initPieces();
};
Board::Board()
{
initBoard();
}
void Board::initBoard()
{
for (int i = 0; i < BOARD_SIZE; i++)
{
vector<Cell> row; //create empty row
for (int j = 0; j < BOARD_SIZE; j++)
{
row.push_back((Cell(i, j)));
}
_board.push_back(row);
}
initPieces();
}
void Board::initPieces()
{
//Set Pawns
for (int i = 0; i < BOARD_SIZE; i++)
{
_board[1][i].setOccupying(new Pawn(White));
_board[6][i].setOccupying(new Pawn(Black));
}
}
void Board::drawBoard()
{
drawLettersCoord();
for (int i = BOARD_SIZE-1; i >= 0; i--)
{
std::cout << i + 1 << " ";
for (int j = 0; j < BOARD_SIZE; j++)
{
_board[i][j].draw();
}
std::cout << " " << i + 1 << std::endl;
}
std::cout << "\n";
}
bool Board::makeMove(int startRow, int startCol, int destRow, int destCol)
{
_board[startRow][startCol].getOccupyingPiece()->isLegalMove(
startRow, startCol, destRow, destCol);
return true;
}
这是单元格 class:
class Cell
{
public:
Cell();
Cell(int row, int col);
Cell(int row, int col, ChessPiece * occupying);
void draw();
ChessPiece * getOccupyingPiece();
void setOccupying(ChessPiece *occupying);
private:
int _row;
int _col;
bool _occupied;
ChessPiece * _pieceOccupying;
};
Cell::Cell()
:Cell(0, 0)
{
setColour();
}
Cell::Cell(int row, int col)
: _row(row), _col(col), _occupied(false)
{
setColour();
}
Cell::Cell(int row, int col, ChessPiece * occupying)
: _row(row), _col(col), _pieceOccupying(occupying), _occupied(true)
{
setColour();
}
void Cell::setOccupying(ChessPiece *occupying)
{
_occupied = true;
_pieceOccupying = occupying;
}
void Cell::draw()
{
int foregroundText;
if (!_occupied)
{
foregroundText = 37;
}
else
{
foregroundText = _pieceOccupying->getPlayer();
}
cout << "[" << foregroundText << ";" << _colour << "m"
<< (_occupied ? _pieceOccupying->getPieceCode(): " ") << "[0m";
}
ChessPiece * Cell::getOccupyingPiece()
{
return _pieceOccupying;
}
当我运行游戏时,我通过调用
创建并绘制了一个新的 BoardBoard _board;
_board.drawBoard();
绘图似乎工作正常,没有任何问题。
但是,当我调用
_board.makeMove(1,0,2,0);
为了检查棋子是否可以走这样的一步,我得到了一个内存错误。调试后,我看到被调用的 Cell 对象中有垃圾,而不是实际数据。当我试图查看指向占用块的指针时,它显示 "Unable To Read Memory",因此当我调用占用块的 isLegalMove 函数时,它崩溃了。
我似乎无法找出问题所在。我不明白为什么矢量内的单元格中会有垃圾,它是在 class 中定义的(没有新的)所以根据我的理解,只要当前的板实例是,它就应该可用活着。
任何人都可以阐明我做错了什么吗?
并非
Cell
的所有构造函数都初始化_occupied
和_pieceOccupying
,这意味着它们在某些Cell
对象中可能具有垃圾值。此外,您的
makeMove
无条件取消引用getOccupyingPiece()
- 它不检查空值。最后,你的棋盘上只有棋子,这意味着
(0, 0)
不包含棋子 - 因为 1.,Cell
对象包含垃圾值在其_pieceOccupying
中,因此您访问随机内存并崩溃。