我有2个班级TournamentMember
和Player
,其中Player
来自TournamentMember
。每个类都有参数化构造函数。
TournamentMember
有这个构造函数:
TournamentMember(const char* name, std::string country, int height);
Player
类有这个构造函数:
Player(int number, int goals, std::string position, std::string feet);
我从Player
类创建一个对象,如下所示:
Player soccer_player(40, 34, "goalkeeper", "right");
每位足球运动员应该有7个属性,分别是姓名,国家,身高,数量,目标,位置,英尺。其中4个属性从Player soccer_player(40, 34, "goalkeeper", "right");
设置,左侧3应从TournamentMember类中分配。我怎么做?我知道一种方法来自方法(设置方法),但我想用构造函数来做,可能是这样的:(我知道下面的例子是错误的)
soccer_player.TournamentMember("John", "USA", 170);
谢谢
答案 0 :(得分:3)
你说玩家来自TournamentMember。所以答案很简单:
在你的玩家构造函数中,你可以这样做:
Player::Player(int a, int b, const char* c, const char* d) : TournamentMember(c, b, a) // this is calling the TournamentMember constructor!!! Just like you wanted =D
{
//Do the rest of the construction here
}
修改强>
这是你更新的问题的答案(请记住,在这个例子中我复制了const char *的地址而不是值。在真正的程序中这是错误的,但为了简单起见我无视这些问题):
这就是您的TournamentMember构造函数的样子:
TournamentMember::TournamentMember(const char* _name, const char* _country, int _height)
{
name = _name;
country = _country;
height = _height;
}
这是你的Player构造函数应该是这样的:
Player::Player(int _number,
int _goals,
int _height,
const char* _name,
const char* _country,
const char* _position,
int _feet) : TournamentMember(_name, _country, _height)
{
number = _number;
goals = _goals;
position = _position;
feet = _feet;
}
答案 1 :(得分:2)
由于您的Player
类派生自TournamentMember
类,并且它们都没有无参数构造函数,因此您需要使用Player
构造函数中的初始化列表来显式调用TournamentPlayer
构造函数,如下所示:
class Player {
Player(int a, int b) : TournamentPlayer(a, b) {
//Parameters are just an example, you can pass parameters just as you want!
}
}
有关初始化列表的更多信息:: C++ Member Initialization List
修改:: 强>
考虑到编辑过的问题,您需要意识到任何类的构造函数只被调用一次(当创建对象时),并且不能显式调用。如果您想通过构造函数设置所有7个属性,则必须更改Player
构造函数的定义,然后使用它来初始化TournamentPlayer
类的变量。像这样的东西::
class Player {
Player(int number, int goals, std::string position, std::string feet, const char* name, std::string country, int height) : TournamentPlayer(name, country, height) {
//Parameters are just an example, you can pass parameters just as you want!
}
}
当您创建派生类的对象时,在进入派生类构造函数的主体之前,将调用基类的无参数构造函数(如果未在初始化列表中明确指定它),这意味着,基类的变量在派生类的变量之前初始化。所以,如果你想用构造函数设置变量,这就是这样做的方法!
答案 2 :(得分:2)
在我看来,你需要使用所有C ++中最缺乏教学的东西。成员初始化列表!
为了满足TournamentMember
,Player
的构造函数需要获取更多语法,初始化列表以及需要传递到{{1}的变量}。
TournamentMember
冒号后面的代码是成员初始化列表。这允许您在执行类的构造函数的主体之前调用成员变量或基类构造函数。
如果要初始化基类,请在此处执行。
必须在进入构造函数体之前构造成员变量,以便它们可以使用。通常使用默认构造函数。如果您有一个没有默认构造函数的成员变量,请使用初始化列表。
如果你有一个复杂的成员变量,你需要初始化并且不想要默认构造,创建一个临时的,然后将临时复制到成员变量中,例如预加载一个向量或者对于具有计算密集型构造逻辑的对象,您不必重复,这里就是这样做的地方。
此外,在使用初始化列表
时,编译器通常可以应用优化进一步阅读:http://en.cppreference.com/w/cpp/language/initializer_list