2017-11-22 19 views
0

ElectricPump를 만들고 해당 객체 내에 "rate"값을 할당하는 방법은 무엇입니까? 내 현재 코드에 다음과 같은 오류가 발생합니다 :읽기 전용 멤버에 값 지정 -

class Pump 
{ 
protected: 
    Pump(float rate); 
    virtual void pump(Boat &) = 0; 
    const float rate; 
}; 

class ElectricPump : public Pump 
{ 
public: 
    ElectricPump(); 
    virtual void pump(Boat &); 
}; 

구현 :

../src/Boat.cpp:144:7: error: assignment of read-only member 'Pump::rate' 

다음은 내 클래스 선언입니다 const를 할당 할 수 없으므로

Pump::Pump(float r) : rate(r){} 

ElectricPump::ElectricPump(){ 
    rate = 5.0; 
} 
+4

'const'는 무엇이라고 생각하십니까 ?? 또한 이것은 회원 초기화리스트의 기본 클래스 생성자를 사용하여 수정할 수 있습니다 :'ElectricPump :: ElectricPump() : Pump (5.0) {' – user0042

+1

} 모든 멤버 변수와 기본 클래스가 건설자. 'Pump'가 기본 생성자가 빠져 있기 때문에 생성 될 수 없다는 다른 오류 메시지가 나타납니다. – user4581301

+2

이 질문을 '당신이 뭘 묻고 있는지 불분명하다'라고 끝내는 것은 어리 석다. 이것은 완벽하게 훌륭한 질문이며 합리적인 C++ 프로그래머는 OP가 거의 즉시 묻고있는 것을 정확히 이해할 것입니다. 내 주요 관심사는 내가 속임수라고 강력하게 의심하는 것이다. – Omnifarious

답변

6

회원이 선언 만 초기화, 예 생성자의 초기화 목록에서

ElectricPump::ElectricPump() : Pump(5.0) { } 
+1

@SoupSeeker - 질문에 대답하는 작은 녹색 체크를 클릭하는 것이 정중 한 것으로 간주됩니다. :-) – Omnifarious

0

회원은 개체의 건설 이전에 할당 된 값이 있어야합니다 const로 표시 : 서브 클래스는 슈퍼 클래스의 데이터 멤버를 초기화 할 수 없습니다 그래서, 당신은 슈퍼 클래스의 생성자 "전화"해야합니다. 또한 Pump에 대한 기본 생성자를 선언하거나 ElectricPump 클래스에 정의 된 생성자를 명시 적으로 호출해야합니다.

이니셜 라이저 목록은 개체를 구성하기 전에 실행되므로 const 구성원을 설정할 수 있습니다.

ElectricPump::ElectricPump() 
    : Pump(5.0) 
{ } 

이것은 당신의 ElectricPump의 건설 전에 값 전달과 Pump의 생성자를 호출합니다 : 문제를 해결하려면이 사용합니다. 나는 크게 initializer lists에 대해 읽고 그들이 어떻게 사용되는지를 제안한다.