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 шт):

Автор решения: Bearded Beaver

Если вам нужна функция, куда передается класс фигуры, который нужно положить на доску, и она внутри себя единообразно создает фигуру и добавляет в соответствующую клетку, то видимо вам нужен шаблон:

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 год, рекомендую воспользоваться умными указателями

→ Ссылка