Я пишу шахматную заявку.Класс Board
содержит массив Square
, каждый из которых может содержать Piece
.Специфичные для типа классы (Pawn
, Rook
и т. Д.) Наследуются от Piece
.
. Для этого Square
имеет переменную-член, которая указывает на конкретный Piece
(который занимает это Square
).
Проблема, с которой я сталкиваюсь, заключается в том, что, когда я пытаюсь настроить Board
, я не могу назначить unique_ptr
, который я создал, дляпеременная-член Square
.
Вот общий поток вызовов функций:
void Board::setBoard()
{
// White Pawn Placement
std::unique_ptr<Piece> wp1 = std::make_unique<Pawn>(PAWN, WHITE);
Board::setPiece("a2", wp1);
}
↓
Pawn::Pawn(Type t, Color c) : Piece(t, c) {}
↓
void Board::setPiece(const std::string &coords, std::unique_ptr<Piece> piece)
{
squareMap[coords].setPiece(piece);
}
↓
void Square::setPiece(std::unique_ptr<Piece> piece)
{
Square::piece = std::move(piece);
}
Я получаю следующую ошибку, когда пытаюсь скомпилировать в строке, содержащей Board::setPiece("a2", wp1);
error: call to implicitly-deleted copy constructor of 'std::unique_ptr<Piece>'
, что, разумеется, немного глотает.
ЕстьВ Интернете есть хорошая документация о наследовании, абстрактных классах, использовании unique_ptr
и т. д., но я не смог понять, как все эти вещи сочетаются друг с другом.
Итак, вопрос:
Как я могу создать объект, присвоить ему unique_ptr, а затем использовать этот unique_ptr для установки переменной-члена другого объекта?
Вот файлы заголовков длякаждый класс, в случае, если это освещение.И, пожалуйста, прости меня за длину моего вопроса.Я сделал это так коротко, как только смогу.
Board.hpp
class Board {
public:
Board();
void printBoard();
Piece getPiece(const std::string &coords);
void setPiece(const std::string &coords, std::unique_ptr<Piece> piece);
~Board();
...
};
Square.hpp
class Square
{
public:
void setPiece(std::unique_ptr<Piece> piece);
Piece* getPiece() const;
protected:
std::unique_ptr<Piece> piece;
...
};
Piece.hpp
class Piece
{
public:
Piece();
Piece(Type, Color);
virtual bool movePiece() = 0; // abstract class
protected:
Color color;
Type type;
bool moved;
...
};
Pawn.hpp
class Pawn : public Piece
{
public:
Pawn(Type t, Color c);
bool movePiece() override;
};