我有這個類棋盤,這裏是它的頭:析構函數和指針類屬性
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.如何刪除指針圖(國王,王后,車,...)存在於我的構造函數棋盤?這是令人困惑的,因爲這些指針被用作我的國際象棋棋盤的一部分,我使用它們直到程序結束。當程序結束時,我需要釋放我的內存,但我不知道如何訪問這些指針。數字本身會被自動刪除,因爲它們都是非指針。 我甚至需要刪除那些指針,看到我使用它們直到最後,然後一切都被釋放?
這功課嗎?如果沒有,爲什麼不使用適當的固定大小的數組('Field board [8] [8];'),並節省動態內存管理容易出錯的麻煩? – ildjarn
不需要檢查'new'是否返回'NULL' - 這絕不會發生。 –
也不需要動態分配或使用繼承。如果你這樣做是一種有趣的練習,那就不要理會我,但是如果速度很重要(這將是一個AI),那麼一組枚舉就會快得多。 –