2017-09-25 134 views
0

这是我遇到的问题。这里是我的士兵等级:使用继承的受保护成员(C++)出现问题

#ifndef SOLDIER_H 
#define SOLDIER_H 

#include <iostream> 

class Soldier{ 
protected: 
    const int m_damage; 
public: 
    Soldier(): 
     m_damage(5) 
    {} 
}; 

#endif // SOLDIER_H 

这里是我的武士阶层,从它继承:

#ifndef WARRIOR_H 
#define WARRIOR_H 

#include "Soldier.h" 

class Warrior: public Soldier{ 
public: 
    Warrior(): 
     m_damage(10) 
    {} 
}; 

#endif // WARRIOR_H 

问题是,当我运行该程序,我得到这个错误:

Warrior.h: In constructor 'Warrior::Warrior()': 
Warrior.h:9:9: error: class 'Warrior' does not have any field named 'm_damage' 
     m_damage(10) 

看来,虽然我设置了

const int m_damage; 

受到Soldier课程的保护,并在Warrior课程中公开继承它,我仍然无法访问它。任何帮助将非常感激。

+3

构造函数不能初始化其他类的成员,甚至不能初始化基类的成员。这是基类构造函数的责任。这与'm_damage'被保护无关。 –

+1

只需提供'Warror'类可以使用的'Soldier'构造函数。 –

+0

请不要在你的帖子上签名。您的帖子已经用您的用户卡“签名”。 – meagar

回答

3

确实如此Warrior没有会员m_damage。它属于Soldier,只有Soldier可以初始化它。

您应该允许Soldier的构造函数将damage参数作为参数,并在构造基类时将所需的值传递给m_damage

#include <iostream> 

class Soldier{ 
protected: 
    const int m_damage; 
public: 
    // explicit will prevent implicit conversions from 
    // being permitted when constructing Soldier 
    // see http://en.cppreference.com/w/cpp/language/explicit 
    explicit Soldier(int damage=5): 
     m_damage(damage) 
    {} 

    int damage() const 
    { 
     return m_damage; 
    } 
}; 

class Warrior: public Soldier{ 
public: 
    Warrior() 
     : Soldier(10) 
    {} 
}; 

// lets make another subclass which implicitly uses the 
// default Soldier constructor. 
class Samurai: public Soldier{ 
public: 
    Samurai() 
    {} 
}; 

int main(){ 
    Warrior w; 
    Samurai s; 

    std::cout << w.damage() << '\n'; 
    std::cout << s.damage() << '\n'; 
} 
+1

非常感谢您,我可以在一分钟内将其设置为正确答案 –