2014-10-30 6 views
1

멤버에 대한 올바른 액세스 지정자가 확실하지 않습니다. var isMouseOverYard. 스 니펫에서는 House을 상속 할 계획이 없습니다. 옵션 1은 기본 클래스와 더 일관성이 있습니다 (어느 클래스에서 상속을받는 경우 마우스가 객체/마당에 있는지 확인할 수 있음). 그러나 House을 상속하지 않으면 옵션 2가 현재 내 의도보다 정확합니다. 이 용도와 관련된 협약이 있습니까?파생 클래스에서 보호 된 지정자 사용

class Object 
{ 
protected: 
    virtual bool isMouseOverObject() const; 
}; 

옵션 1 개

class House : public Object 
{ 
protected: 
    virtual bool isMouseOverObject() const override; 
    bool isMouseOverYard() const; 
}; 

옵션 2

class House : public Object 
{ 
protected: 
    virtual bool isMouseOverObject() const override; 

private: 
    bool isMouseOverYard() const; 
} 
+0

그렇듯이 클래스는 완전히 쓸모가 없습니다. –

+1

@ BЈови this이 질문에 대한 모든 내용을 포함하여 전체 구현을 보시겠습니까? – JorenHeit

+0

@JorenHeit 아니, 차라리 SCCEE (http://www.catb.org/esr/faqs/smart-questions.html)를 볼 수 있습니다. –

답변

2

내 일반적인 경험 규칙은 최대한의 범위로 가시성을 제한합니다. 나는. 나는 isMouseOverObjectHouse 클래스에 비공개로 만들 것입니다. 지원 방법은 다른 사람에서 숨겨진 클래스에 개인이 될 수 있기 때문에

0

적어도 내가 정확히 기억한다면 비얀 Stroustroup에 의한 규칙은, 보호 결코 데이터입니다. 이것은 때로는 유혹적 일지 모르지만 get/set 함수를 통해서만 데이터 멤버에 액세스하는 것이 거의 항상 좋습니다. 그런 다음이 함수를 보호 할 수 있으므로 파생 클래스에서는 사용할 수 있지만 외부에서는 사용할 수 없습니다.

따라서 귀하의 경우에는 옵션 2를 사용하고 필요한 경우 얻을 수있는 간단한 get/set 함수를 추가 할 것을 고려합니다.

편집 : 나는 OP에 의한 오타 때문에 함수 대신 변수에 대한 질문이라고 잘못 생각했다.

+0

위 질문에 '데이터'가 표시되지 않습니다. 데이터 멤버 ... –

+0

@MichalHosala : 질문의 원래 코드가'()'을 놓쳤으므로 데이터 멤버처럼 보입니다. –

+0

아 ~. 나는 이것을 너무 훑어 보았다. isMouseOverYard가 변수라고 생각했습니다. 나는 내 대답을 지울거야. 편집 : @JohnZwinck 설명해 ... – JorenHeit

1

두 옵션은 잘있다가, 옵션 2, 더 나은, 개인적으로 클래스 멤버

1

그것은 정말 중요합니까에 국한 접근되고 . 나중에 더 유연 해지기 때문에 protected으로 남겨 두었습니다. 어쨌든 누군가가 "오용"하면 너무 많은 것을 손상시키지 않도록 const 메소드입니다.