2017-09-25 14 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コンストラクタは、ダメージパラメータを引数として受け取り、ベースクラスを構築するときに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

ありがとうございました。私は正解として1分で設定することが許されています –

関連する問題