gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 10:17:31 30 4
gpt4 key购买 nike

我有这个标题(字段)

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

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

这个 header (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;
}

这是我的问题

这是我的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");

最佳答案

But this here TicTacToeField(std::vector<std::vector<int>> field)) is wrong [...]



您应该将 int的vector的 vector 传递到此处。这意味着 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 initializerlists
    初始化成员,而不是构造类并
    像您一样初始化成员。

  • 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++中调用基类的参数化构造方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61447454/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com