2013-03-17 1 views
1

보호 된 멤버가있는 추상 기본 클래스가 있으면 파생 클래스에만 읽기 액세스를 제공하려면 어떻게해야합니까?파생 클래스에 대해 읽기 전용으로 멤버를 만드는 방법은 무엇입니까?

필자의 의도를 설명하기 위해 필자는 최소한의 예를 제시합니다. 이것은 기본 클래스입니다.

class Base 
{ 
public: 
    virtual ~Base() = 0; 
    void Foo() 
    { 
     Readonly = 42; 
    } 
protected: 
    int Readonly;     // insert the magic here 
}; 

이것은 파생 클래스입니다. 이 기본 클래스에 의해 수정 될 필요가 있기 때문에

class Derived : public Base 
{ 
    void Function() 
    { 
     cout << Readonly << endl; // this should work 
     Readonly = 43;   // but this should fail 
    } 
}; 

는 불행하게도 나는 const 멤버를 사용할 수 없습니다. 의도 한 행동을 어떻게 일으킬 수 있습니까?

+0

상수로 만드는 것 외에는 할 수 없습니다. –

+2

비공개로 설정하고 보호 된 getter 메소드 만 제공 할 수 있습니까? –

+1

'Readonly'를 초기화하기 위해 생성자를 정의해야합니다. –

답변

8

일반적인 방법은 기본 클래스에 멤버 private을하는 것입니다, 그리고 protected 접근을 제공 : 당신은 회원이 원하는 경우 보호 일원으로서

class Base 
{ 
public: 
    virtual ~Base() = 0; 
    void Foo() 
    { 
     m_Readonly = 42; 
    } 
protected: 
    int Readonly() const { return m_Readonly; } 
private: 
    int m_Readonly; 
}; 
+0

내 대답보다 훨씬 낫다. +1. – jrok

+0

감사합니다. 때로는 너무 간단합니다! – danijar

+1

'inline' 키워드를 삭제하십시오; 그것은 선언문에 정의되어있는 덕분에'인라인 (inline) '하다. –

4

는 파생 클래스에서 볼 수 있습니다 파생 클래스에서 읽기 전용으로, private로 설정하고 getter 함수를 제공 할 수 있습니다.

class Base { 
public: 
    Base(); 
    virtual Base(); 

    public: 
     int getValue() {return value;} 

    private: 
     int value; 
} 

이 방법을 사용하면 기본 클래스의 값을 변경할 수 있으며 하위 클래스는 읽기 전용입니다.

0

상속에 대한 최선의 지침은 항상 멤버 변수를 private로 설정하고 접근 함수를 public으로 만들어야합니다. 파생 클래스에서 호출해야하는 공용 함수가있는 경우 스파게티 코드를 작성한다는 의미입니다. (출처 : Meyer의 Effective C++ item 22)

+0

그럼'protected' 키워드는 무엇입니까? ;) – danijar