У меня есть этот класс 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.Почему я не могу удалить все свои поля с помощью написанного выше метода? Когда я пытаюсь это сделать, программа выдает ошибку «Тип блока действителен», которая, как я знаю, вызвана попыткой удалить несуществующую память.Когда я это комментирую, программа работает отлично.А шахматная доска - это матрица 8х8, поэтому я могу удалить ее, как я пытался здесь.
Мой второй вопрос:
2.Как я могу удалить указатели на фигуры (King, Queen, Rook, ...), которые существуют в моем конструкторе для шахматной доски? Это сбивает с толку, потому что эти указатели используются как части моей шахматной доски, и я использую их доконец программы.Когда программа заканчивается, мне нужно освободить память, но я не знаю, как получить доступ к этим указателям.Сами рисунки автоматически удаляются, потому что все они не являются указателями. Нужно ли вообще удалять эти указатели , видя, как я их использую до конца, а потом все освобождается?