2017-09-25 13 views
0

여기에 제가 가지고있는 문제가 있습니다. 여기 내 군인 클래스입니다 :상속 된 보호 된 멤버를 사용하여 문제가 발생했습니다. (C++)

Warrior.h: In constructor 'Warrior::Warrior()': 
Warrior.h:9:9: error: class 'Warrior' does not have any field named 'm_damage' 
     m_damage(10) 
: 나는이 프로그램을 실행할 때

이 문제가
#ifndef WARRIOR_H 
#define WARRIOR_H 

#include "Soldier.h" 

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

#endif // WARRIOR_H 

, 나는이 오류가 : 여기

#ifndef SOLDIER_H 
#define SOLDIER_H 

#include <iostream> 

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

#endif // SOLDIER_H 

그리고 것은 상속, 내 전사 클래스입니다

설정 한 것 같습니다.

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 분 안에 정답으로 설정해 주셔서 고맙습니다. –