исходя из Java, я немного запутался в вызове конструктора базового класса (или super()
).
У меня есть 2 класса: игрок (абстрактный класс) и HumanPlayer который является ребенком игрока.
теперь у меня есть конструктор для 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 ++, испытывая трудности с его синтаксисом.
С уважением,
Единственный способ инициализировать базу производного класса — в списке инициализации конструктора. Это вещь после двоеточия, перед телом функции. Там нет другого НОРМАЛЬНЫЙ способ сделать это.
HumanPlayer() :
Player("...", list_of_points)
{
...
}
Если вы действительно ДОЛЖНЫ инициализировать основную «в» теле конструктора, а не в списке, вы должны изменить свой код — например, введя функцию «initialize ()» в базовом классе или используя «pimpl idiom». ».
Если биты «получить имя от пользователя …» и «получить очки от пользователя …» очень просты и могут быть реализованы в виде простых выражений или вызовов функций:
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)
{
}
Некоторые могут посчитать это хакерством: злоупотребление значениями параметров по умолчанию для создания экземпляра объекта, используемого в конструкторе. Но это работает. Если вы используете компилятор C ++, который поддерживает хотя бы стандарт C ++ 11, это можно сделать немного лучше, другим способом.