C++ передача класса как параметра
Имеется родительский класс GamePiece, от него наследуется фигура Pawn.
class GamePiece
{
public:
GamePiece(char PieceColor) : mPieceColor(PieceColor) {}
virtual char GetPiece() = 0;
char GetColor() {
return mPieceColor;
}
private:
virtual bool // поведение фигуры
const char mPieceColor;
};
class PawnPiece : public GamePiece
{
public:
PawnPiece(char PieceColor) : GamePiece(PieceColor) {}
private:
char GetPiece() override{
return 'P';
}
{
/* Поведение фигуры */
}
};
Также имеется GamePiece игровая доска, на которой мои пешки будут стоять. Моя цель - реализовать функцию установки пешки на доску. Пока что у меня получилась плохая на мой взгляд функция,работающая только для одной фигуры.
class CBoard
{
public:
GamePiece* GameBoard[8][8];
void SetPawnPiece(int iRow, int iCol, char PieceColor) {
GameBoard[iRow][iCol] = new PawnPiece(PieceColor);
}
...
Как написать универсальную функцию, фигуру которой я могу передавать как параметр, или с которой будет удобнее работать на Ваш взгляд?
Ответы (1 шт):
Если вам нужна функция, куда передается класс фигуры, который нужно положить на доску, и она внутри себя единообразно создает фигуру и добавляет в соответствующую клетку, то видимо вам нужен шаблон:
class CBoard
{
public:
GamePiece* GameBoard[8][8];
template <typename T>
void SetPiece(int iRow, int iCol, char PieceColor) {
GameBoard[iRow][iCol] = new T(PieceColor);
}
Использование:
CBoard board;
board.SetPiece<PawnPiece>(1, 0, 'W')
Обратите внимание, что все ваши фигуры должны иметь конструктор, принимающий char в качестве параметра
upd
Также обратите внимание на очень вероятную утечку памяти если несколько раз поместить фигуру в одну и ту же клетку. На дворе 2022 год, рекомендую воспользоваться умными указателями