Как вызвать параметризованный конструктор базового класса в C ++? - PullRequest
0 голосов
/ 26 апреля 2020

У меня есть этот заголовок (Поле)

class TicTacToeField{
protected:
    std::vector<std::vector<int>> field;

public:
    TicTacToeField();
    TicTacToeField(std::vector<std::vector<int>> field);
};

И этот заголовок (Игра), который наследует / расширяет класс выше (Поле)

class TicTacToeGame : public TicTacToeField {
private:
    std::string player1_;
    std::string player2_;
    int currentPlayer_;
public:
    TicTacToeGame(std::string player1, std::string player2);

Это конструктор Поле класса

TicTacToeField::TicTacToeField(vector<vector<int>> field) {
    this->field = field;
}

Вот моя проблема

Это конструктор моего класса игры

TicTacToeGame::TicTacToeGame(std::string player1, std::string player2) : TicTacToeField(std::vector<std::vector<int>> field)) {
    this->player1_ = player1;
    this->player2_ = player2;
    this->field = field;
    currentPlayer_ = 1;

Но это здесь TicTacToeField(std::vector<std::vector<int>> field)) неправильно, и я на самом деле не знаю, что мне следует написать в скобках ... если я использую конструктор по умолчанию TicTacToeField(), тогда все в порядке, но как я могу использовать параметризованный?

И как Я создаю новый объект? Я пробовал это в моем main. cpp, но это работает только если я расширяю конструктор по умолчанию ...

TicTacToeGame g("Player1", "Player2");

1 Ответ

1 голос
/ 27 апреля 2020

Но это здесь TicTacToeField(std::vector<std::vector<int>> field)) неверно [...]

Вы должны передать сюда вектор вектора int s . Это означает, что TicTacToeGame должен иметь параметр std::vector<std::vector<int>>, который впоследствии может быть передан в конструктор родительского класса TicTacToeField. Пример

TicTacToeGame(std::string player1, std::string player2, std::vector<std::vector<int>> field = {})
//                                                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ provided as default arguments
   : TicTacToeField{ std::move(field) } // resources (preferably) can be moved, rather copy constructing them.
   , player1_{ std::move(player1) }     // Otherwise, pass by const reference
   , player2_{ std::move(player2) }
   , currentPlayer_{ 0 }
{}

Поскольку вы предоставляете аргумент родительского конструктора как аргумент по умолчанию , теперь у вас есть следующие две опции для построения TicTacToeGame.

TicTacToeGame game{ "player1", "player2" };
// or pass std::vector<std::vector<int>>
TicTacToeGame game2{ "player1", "player2", {{1, 2, 3},{4, 5}} };

Однако, если у вас нет mField доступного на момент создания TicTacToeGame, вы можете либо вызвать конструктор по умолчанию TicTacToeField (т.е. родительский класс), либо передать построенный по умолчанию std::vector<std::vector<int>>, чтобы выбрать параметризованный конструктор TicTacToeField.

TicTacToeGame(std::string player1, std::string player2)
   : TicTacToeField{ std::vector<std::vector<int>>{} }
   // or simply default constructor : TicTacToeField{}
   , player1_{ std::move(player1) }
   , player2_{ std::move(player2) }
   , currentPlayer_{ 0 }
{}

Несколько предложений:

  • Предоставление различных имен аргументам конструктора и членам класса.
  • Использование Инициализатор членов перечисляет , чтобы инициализировать членов, а скорее создать класс и инициализировать членов, как вы это сделали.

class TicTacToeField
{
   std::vector<std::vector<int>> mField;  // class member `mField`
public:
   TicTacToeField(std::vector<std::vector<int>> field) // parameter `field`
      : mField{ std::move(field) }        // member initializer lists
   {}
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...