来自Java我对调用基类构造函数(或super()
)有点困惑。
我有2个类:播放器(抽象类),以及 HumanPlayer ,它是Player的子级。
现在,我有一个Player的构造函数,声明:
Player(string name, list<Point> points);
现在我想尝试实现这种方式:
HumanPlayer() {
string name = get name from user...
list<Point> points = get points from user...
...
...
...
super(name, points);
}
对c ++来说真的很新,用它的语法很难。 的问候,
答案 0 :(得分:3)
初始化派生类的基础的唯一方法是在构造函数的初始化列表中。这是冒号之后的事情,在函数体之前。没有其他 NORMAL 方法可以做到这一点。
HumanPlayer() :
Player("...", list_of_points)
{
...
}
如果你真的必须在构造函数的主体中“而不是在列表中”初始化基类,则必须修改代码 - 例如通过在基类中引入“initialize()”函数或使用“pimpl成语”。
答案 1 :(得分:0)
如果“从用户获取名称...”和“从用户获取点...”位非常简单,并且可以实现为简单表达式或函数调用:
HumanPlayer()
: Player( "get name from user... code",
"get points from user... code")
{
}
另一方面,如果两个“get”位都是非平凡的,并且彼此之间存在相互依赖关系,那么这将会更复杂一些。这是一个典型方法的简要概述:
class HelperClass {
public:
std::string name;
std::list<Point> points;
HelperClass()
{
// The constructor here will do whatever is needed to initialize name and points
}
};
// ...
HumanPlayer(const HelperClass &helper=HelperClass())
: Player(helper.name, helper.points)
{
}
有些人可能会发现这有点像hack-ish:滥用默认参数值来实例化构造函数中使用的对象。但它的确有效。如果使用至少支持C ++ 11标准的C ++编译器,可以用不同的方式稍微改善一下。