наследование — C ++ вызывает конструктор базового класса внутри дочернего класса

исходя из 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 ++, испытывая трудности с его синтаксисом.
С уважением,

0

Решение

Единственный способ инициализировать базу производного класса — в списке инициализации конструктора. Это вещь после двоеточия, перед телом функции. Там нет другого НОРМАЛЬНЫЙ способ сделать это.

HumanPlayer() :
Player("...", list_of_points)
{
...
}

Если вы действительно ДОЛЖНЫ инициализировать основную «в» теле конструктора, а не в списке, вы должны изменить свой код — например, введя функцию «initialize ()» в базовом классе или используя «pimpl idiom». ».

3

Другие решения

Если биты «получить имя от пользователя …» и «получить очки от пользователя …» очень просты и могут быть реализованы в виде простых выражений или вызовов функций:

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, это можно сделать немного лучше, другим способом.

0

По вопросам рекламы [email protected]