многоуровневые конструкторы в с ++ - PullRequest
0 голосов
/ 16 декабря 2018

Хорошо, у нас была задача создать конструктор для класса, который наследуется от другого, который также наследует от другого класса.Нашим решением для этого был следующий код:

AxeThrowerTroll:: AxeThrowerTroll(std::string name, char team, int health, unsigned int power, unsigned int armor, unsigned int numAxes)
: Troll(Monster(name, team, health, power), armor(armor)), numAxes(numAxes)
{
}

Но если мы хотим скомпилировать код, мы получаем следующую ошибку:

error: 'armor' cannot be used as a function

Определение тролля:

class Troll : public Monster
{
public:
    unsigned int armor;

    Troll(std::string, char, int, unsigned int, unsigned int);
    virtual void attack(Monster*);
    virtual void support(Monster*);
    virtual std::string asString();
};

Монстр:

class Monster{

public:
    std::string name ;
    char team;
    int health;
    unsigned int power;

    Monster(std::string, char, int, unsigned int);
    virtual ~Monster();
    virtual void attack(Monster*);
    virtual void support(Monster*);
    virtual std::string asString();

};

У кого-нибудь из вас есть предложение, как нам заставить это работать?

1 Ответ

0 голосов
/ 16 декабря 2018

Полагаю, ваше AxeThrowerTroll::AxeThrowerTroll определение должно выглядеть так:

AxeThrowerTroll::AxeThrowerTroll(std::string _name, 
                                 char _team, 
                                 int _health, 
                                 unsigned int _power,
                                 unsigned int _armor, 
                                 unsigned int _numAxes)
: Troll(_name, _team, _health, _power), armor(_armor)

Troll. C'or должен передаваться аргументы как есть, как того требует подпись, и вы не должныдля него не создан Monster экземпляр (это ответственность Troll).

Другое дело - Troll не имеет объявленного numAxes члена-члена (в соответствии с вашим кодом).Как только это произойдет, добавьте его в свой список инициализации.

Как правило: все аргументы в декларации C'tor не должны скрывать элементы данных (поэтому я добавил подчеркивание - "_" - перед каждым),И каждый C'tor должен вызывать только непосредственный базовый класс C'tor и члены-данные в своем списке инициализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...