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

Posted

技术标签:

【中文标题】如何在 C++ 中调用基类的参数化构造函数?【英文标题】:How to call parameterized Constructor of Base class in C++? 【发布时间】:2020-04-26 20:14:07 【问题描述】:

我有这个标题(字段)

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

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

而这个头(Game)继承/扩展了上面的类(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;

这是我的问题

这是我的游戏类的构造函数

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&lt;std::vector&lt;int&gt;&gt; field)) 是错误的,我实际上不知道我应该在括号中写什么...如果我使用默认构造函数TicTacToeField() 那么它很好,但是我怎样才能使用参数化的呢?

我如何创建一个新对象?我在我的 main.cpp 中尝试了这个,但它只有在我扩展默认构造函数时才有效......

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

【问题讨论】:

好吧,你显然必须向它传递一个整数向量的向量。无论您在哪里获得该向量完全取决于您,并且显示的代码中没有足够的信息可以说明更多信息。无论你从哪里得到这个整数向量的向量,你都会得到它,然后将它传递给父类的构造函数。另外,请每个问题一个问题。 我知道我必须传递一个整数向量的向量,我在我的 Game.cpp 中创建它并传递它并且它可以工作。但是我怎样才能从 main.cpp 传递它呢?我不确定如何在主函数中调用参数化构造函数 只有子类调用超类的构造函数。如果您需要将某些内容传递给超类的构造函数,则将其传递给子类的构造函数,然后将其传递给超类的构造函数。您的子类的构造函数已经接受了两个参数,player1 和 player2。添加第三个参数,并让构造函数将新的第三个参数传递给父类的构造函数。 【参考方案1】:

但是这里是TicTacToeField(std::vector&lt;std::vector&lt;int&gt;&gt; field)) 错了[...]

您应该将ints 的向量的向量传递到这里。意思是,TicTacToeGame 应该有一个参数std::vector&lt;std::vector&lt;int&gt;&gt;,稍后可以将其传递给父类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 ;

但是,如果在构造 TicTacToeGame 时没有可用的 mField,则可以调用 TicTacToeField 的默认构造函数(即父类)或传递默认构造的 std::vector&lt;std::vector&lt;int&gt;&gt; 来选择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
   
;

【讨论】:

以上是关于如何在 C++ 中调用基类的参数化构造函数?的主要内容,如果未能解决你的问题,请参考以下文章

C++中如何在子类的构造函数中调用基类的构造函数来初始化基类成员变量

C++中的派生类,可以不定义对象直接调用基类的成员和调用自己的成员函数嘛???

C++中派生类的构造函数怎么显式调用基类构造函数?

C++中,建立子类对象的时候,会调用基类的构造函数,

在其派生类C++的构造函数中调用基类的构造函数[重复]

基类构造函数参数值[重复]