2017-09-25 158 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

非常感謝您,我可以在一分鐘內將其設置爲正確答案 –