Цепочка конструктора не использует значения по умолчанию для членов класса?

У меня есть два класса Юнит и Арчер. Арчер наследует от юнита. Я пытался использовать конструктор цепочки, чтобы установить статистику для базового класса, но статистика, кажется, обнуляется, если я использую следующий код:

#include<iostream>

using namespace std;

class Unit{
int damage = 0;
int curHp = 0;
int maxHp = 1;
int range = 0;
int cost = 0;

public:
Unit(int _damage,int _maxHp,int _range,
int _cost){
damage = _damage;
curHp = maxHp = _maxHp;
range = _range;
cost = _cost;
}

int getCost(){
return cost;
}
};

class Archer: public Unit{
int damage = 25;
int range = 50;
int maxHp = 100;
int cost = 150;
int stepSize = 25;
int returnedCoins = 0;
public:
Archer():Unit(damage,maxHp,range,
cost){};
};

int main()
{
Unit *curUnit =  new Archer();
cout<< curUnit->getCost()<<endl;;
}

Выходное значение равно 0. Если я вызываю construtor модуля со значением вместо использования стоимости (например, 25), я получаю значение, которое я использовал. По какой-то причине базовое значение, которое я установил в классе лучника, совсем не используется.

Кроме того, я немного новичок в ООП, поэтому я думаю, что могу поступить неправильно. Я был бы счастлив, если бы кто-то мог показать мне правильный способ сделать это.

4

Решение

Это не стартер

class Archer: public Unit{
int damage = 25;
int range = 50;
int maxHp = 100;
int cost = 150;
int stepSize = 25;
int returnedCoins = 0;
public:
Archer():Unit(damage,maxHp,range,
cost){};
};

Базы инициализируются до члены вашего класса. И говоря о том, что вы дублируете тех же членов без причины. Просто передайте это как аргументы:

class Archer: public Unit{
int stepSize = 25;
int returnedCoins = 0;
public:
Archer():Unit(25,100,50,
150){};
};

Если ваша цель состояла в том, чтобы просто дать этим значениям осмысленные имена, вы можете сделать их статическими константами класса:

class Archer: public Unit{
static constexpr int damage = 25;
static constexpr int range = 50;
static constexpr int maxHp = 100;
static constexpr int cost = 150;

int stepSize = 25;
int returnedCoins = 0;
public:
Archer():Unit(damage,maxHp,range,
cost){};
};
7

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

Других решений пока нет …