2017-09-25 2 views
0

Hier ist das Problem, das ich habe. Hier ist mein Soldat Klasse:Problem mit dem geerbten geschützten Member (C++)

#ifndef SOLDIER_H 
#define SOLDIER_H 

#include <iostream> 

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

#endif // SOLDIER_H 

Und hier ist meine Krieger-Klasse, erbt von ihm:

#ifndef WARRIOR_H 
#define WARRIOR_H 

#include "Soldier.h" 

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

#endif // WARRIOR_H 

Das Problem ist, wenn ich das Programm ausführen, ich diesen Fehler:

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

Es scheint, dass, obwohl ich

const int m_damage; 
gesetzt habe

Wie in der Soldier-Klasse geschützt und in der Warrior-Klasse öffentlich geerbt, kann ich immer noch nicht darauf zugreifen. Jede Hilfe würde sehr geschätzt werden.

+3

Ein Konstruktor kann andere Member der Klasse nicht initialisieren, nicht einmal die einer Basisklasse. Das ist die Verantwortung des Konstruktors der Basisklasse. Dies hat nichts damit zu tun, dass 'm_damage' geschützt ist. –

+1

Stellen Sie einfach einen 'Soldier'-Konstruktor bereit, den die' Warror'-Klasse verwenden kann. –

+0

Bitte unterschreiben Sie Ihre Beiträge nicht. Ihre Beiträge sind bereits mit Ihrer Benutzerkarte "signiert". – meagar

Antwort

3

Es ist wahr Warrior hat kein Mitglied m_damage. Es gehört zu Soldier und nur Soldier kann es initialisieren.

Sie sollten dem Konstruktor Soldier erlauben, den Parameter damage als Argument zu verwenden und den Wert, den Sie für m_damage haben möchten, an ihn übergeben, wenn Sie Basisklassen erstellen.

#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

Vielen Dank, ich darf es in einer Minute als richtige Antwort setzen –

Verwandte Themen