Цепочка конструктора не использует значения по умолчанию для членов класса? - PullRequest
0 голосов
/ 28 ноября 2018

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

#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. Если я вызываю конструктора модуля сзначение вместо использования стоимости (например, 25), я получаю значение, которое я использовал.По какой-то причине базовое значение, которое я установил в классе лучника, совсем не используется.

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

1 Ответ

0 голосов
/ 28 ноября 2018

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

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){};
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...