如何在C ++中调用基类的参数化构造方法?

时间:2020-04-26 20:14:07

标签: c++ inheritance constructor

我有这个标题(字段)

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);

这是Field类的构造函数

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

这是我的问题

这是我的Game类的构造函数

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 个答案:

答案 0 :(得分:1)

但是这里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 }
{}

由于您将父构造函数的参数设置为default argument,所以现在有以下两个选择来构造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 }
{}

一些建议:

  • 为构造函数参数和成员提供不同的名称 班级的。
  • 使用member initializer lists 初始化成员,而不是构造类并 像您一样初始化成员。

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
   {}
};