簡體   English   中英

如何在C++中調用Base class的參數化構造函數?

[英]How to call parameterized Constructor of Base class in C++?

我有這個 header(字段)

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

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

而這個 header (Game) 繼承/擴展了上面的 class (Field)

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

這是字段 class 的構造函數

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

這是我的問題

這是我的游戲 class 的構造函數

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()那么很好,但我怎樣才能使用參數化的呢?

以及如何創建一個新的 object? 我在我的 main.cpp 中嘗試了這個,但它只有在我擴展默認構造函數時才有效......

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

但是這里的TicTacToeField(std::vector<std::vector<int>> field))是錯誤的 [...]

您應該將向量的int傳遞到這里。 意思是, TicTacToeGame應該有一個參數std::vector<std::vector<int>> ,稍后可以將其傳遞給父 class 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}} };

但是,如果在構造TicTacToeGame時沒有可用的mField ,則可以調用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 }
{}

幾個建議:

  • 為構造函數 arguments 和 class 的成員提供不同的名稱。
  • 使用成員初始化器列表來初始化成員,而不是像您一樣構造 class 並初始化成員。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM