C ++中的多层构造函数

时间:2018-12-16 17:26:36

标签: c++ inheritance constructor

好吧,我们有了Task来为一个继承自另一个类的类创建构造函数,该构造器也继承自另一个类。我们对此的解决方案是以下代码:

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 :(得分:1)

我想您的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'tor应该按照其签名要求传递原样,并且您不应该为其构建Monster实例(它是{{1} })。

另一件事-Troll没有声明Troll数据成员(根据您的代码)。完成后-将其添加到您的初始化列表中。

通常:C'tor脱节中的所有参数都不应遮盖数据成员(这就是为什么我在每个数字之前加下划线-“ _”)。而且每个C'tor都只能在其初始化列表中调用直接基类C'tor和数据成员。