Как создать 2-мерный массив для абстрактного класса

0

Я пытаюсь построить шахматную доску шахматных фигур. Я получил это

class ChessPiece 
{
public:
    ChessPiece();
    virtual ~ChessPiece();
    virtual bool movePiece() = 0;
};

и этот класс

class Pawn: public ChessPiece
{
public:
    Pawn();
    virtual ~Pawn();
    bool movePiece();
};

в моем основном я пытаюсь создать 2-мерный массив ChessPiece, но потому, что он абстрактный, что дает мне проблемы.

Я попробовал это

ChessPiece** board = new ChessPiece[8][8];

или

ChessPiece*** board = new ChessPiece*[8];

но это не похоже на работу.. любая помощь будет очень благодарна Спасибо!

  • 0
    ChessPiece*** board = new ChessPiece*[8]; Ура, теперь вы 3-звездный программист. Congrats!
Теги:
arrays
inheritance
abstract-class

1 ответ

4
Лучший ответ

Ваша доска должна содержать указатели на ChessPiece с каждой частью, выделенной отдельно. Доска всегда 8x8, поэтому нет причин выделять ее new. Вместо:

ChessPiece * board[8][8];

Тогда что-то вроде:

for (int i = 0; i < 8; ++i) {
    board[1][i] = new Pawn();
}
board[0][0] = new Rook();
board[0][1] = new Knight(); 
// etc...

(EDIT: удаленная реализация с использованием массивов фиксированного размера для каждого типа штук, поскольку пешки могут быть продвинуты на другие типы штук).

Конечно, вы можете упорядочить данные по-разному. Вероятно, вы должны сгруппировать все данные игры в класс или структуру ChessGame. Вы можете написать класс PlayerPieces содержащий только одну часть игрока, а затем поместить 2 из них в ChessGame. Есть много возможностей - в конечном счете это зависит от вашего собственного стиля и предпочтений.

  • 0
    Я могу это сделать. но разве new не выделяет память для этого? Что произойдет, если я отправлю свою доску в другую функцию? Он будет удален, когда объем закончится?
  • 2
    Ваши программы должны иметь четко определенные правила владения. Нет причины, по которой функция, которая принимает вашу шахматную доску в качестве параметра, удалит ее - передайте ее по указателю или по ссылке.
Показать ещё 8 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню