我有这个标题(字段)
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");
答案 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 }
{}
一些建议:
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
{}
};