【发布时间】:2012-01-22 20:23:43
【问题描述】:
我有这个类 ChessBoard,这是它的标题:
class ChessBoard
{
Field** board;
Color currentColor;
public:
ChessBoard();
ChessBoard(const ChessBoard&);
Field* findField(std::string);
ChessBoard& operator = (const ChessBoard&);
bool checkIfFieldHasFigure(std::string);
void writeOneState(SahApi*);
void playAllMoves(std::istream*, SahApi*);
void playMove(std::string);
~ChessBoard();
};
我有它的构造函数,它创建了棋盘的开始阶段:(很可怕,我知道 :))
ChessBoard::ChessBoard()
{
int i, j;
Error err;
board = new Field*[8];
if(!board)
{
err.writeToOutput(1);
exit(1);
}
for(i = 0; i < 8; i++)
{
board[i] = new Field[8];
if(!board[i])
{
err.writeToOutput(1);
exit(1);
}
}
currentColor = WHITE;
char c;
std::string s;
Figure f;
for(i = 0; i < 8; i++)
for(j = 0; j < 8; j++)
{
s.clear();
c = i + 'A';
s.push_back(c);
c = j + '1';
s.push_back(c);
board[i][j].position.assign(s);
if((j > 1) && (j < 6))
board[i][j].hasFigure = 0;
else board[i][j].hasFigure = 1;
if((i+j+2) % 2)
board[i][j].color = WHITE;
else board[i][j].color = BLACK;
if( ((j==0)||(j==7)) && ((i==0)||(i==7)) )
{
Rook* r = new Rook(((j==0)?WHITE:BLACK), s);
if(!r)
{
err.writeToOutput(1);
exit(1);
}
board[i][j].putFigure(r);
}
else if( ((i==1)||(i==6)) && ((j==0)||(j==7)) )
{
Knight* n = new Knight(((j==0)?WHITE:BLACK), s);
if(!n)
{
err.writeToOutput(1);
exit(1);
}
board[i][j].putFigure(n);
}
else if( ((i==2)||(i==5)) && ((j==0)||(j==7)) )
{
Bishop* b = new Bishop(((j==0)?WHITE:BLACK), s);
if(!b)
{
err.writeToOutput(1);
exit(1);
}
board[i][j].putFigure(b);
}
else if( (i==3) && ((j==0)||(j==7)))
{
Queen* q = new Queen(((j==0)?WHITE:BLACK), s);
if(!q)
{
err.writeToOutput(1);
exit(1);
}
board[i][j].putFigure(q);
}
else if( (i==4) && ((j==0)||(j==7)) )
{
King* k = new King(((j==0)?WHITE:BLACK), s);
if(!k)
{
err.writeToOutput(1);
exit(1);
}
board[i][j].putFigure(k);
}
else if( (j==1) || (j==6) )
{
Pawn* p = new Pawn(((j==1)?WHITE:BLACK), s);
if(!p)
{
err.writeToOutput(1);
exit(1);
}
board[i][j].putFigure(p);
}
}
}
我还需要 ChessBoard 的析构函数,类似于:
ChessBoard::~ChessBoard()
{
//for(int i = 0; i < 8; i++)
// delete board[i];
delete [] board;
}
部分注释掉的原因是我的第一个问题:
1.为什么我不能用上面写的方法删除我所有的字段? 当我尝试这样做时,程序进入“块类型有效”错误,我知道这是由于试图删除不存在的内存造成的。当我将其注释掉时,该程序运行良好。 ChessBoard 是一个 8x8 矩阵,所以我应该可以像我在这里尝试的那样删除它。
我的第二个问题是:
2。如何删除我的 Chess Board 构造函数中存在的指向图形(King、Queen、Rook、...)的指针?这很令人困惑,因为这些指针被用作我的 Chess Board 的一部分,而我使用它们直到程序结束。当程序结束时,我需要释放我的内存,但我不知道如何访问这些指针。数字本身会被自动删除,因为它们都是非指针。 我什至需要删除那些指针,因为我一直使用它们直到最后,然后一切都被释放了吗?
【问题讨论】:
-
这是作业吗?如果没有,为什么不使用适当的固定大小数组 (
Field board[8][8];) 并省去动态内存管理容易出错的麻烦? -
没有必要检查
new是否返回NULL- 这永远不会发生。 -
也不需要动态分配碎片或使用继承。如果您将此作为一个有趣的练习,请忽略我,但如果速度很重要(对于 AI 而言),枚举数组会快得多。
标签: c++ pointers memory-management constructor destructor