2014-10-30 112 views
1

我不確定成員變量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

因爲它們是,你的類是完全沒用的 – 2014-10-30 08:38:45

+1

@BЈовић你想看看整個實現,包括這個問題的所有內容都是* not * about嗎? – JorenHeit 2014-10-30 08:41:10

+0

@JorenHeit不,我寧願看到一個SCCEE(http://www.catb.org/esr/faqs/smart-questions.html) – 2014-10-30 08:43:03

回答

2

我的一般經驗法則是儘可能地限制可見度。即我會在House類中使isMouseOverObject私有。

0

的約定,至少由Bjarne Stroustroup如果我沒記錯,是從未保護了數據。這有時候看起來很誘人,但通過get/set函數只訪問數據成員幾乎總是更好。這些功能可以被保護,使它們可用於派生類,但不適用於外部世界。

因此,在你的情況下,我會選擇選項2,並考慮添加一些簡單的獲取/設置功能,以防您需要它們。

編輯:我被誤導思考這個問題是關於一個變量,而不是一個函數,由於由OP的錯字。

+0

我在上面的問題中沒有看到任何「數據」,即沒有數據成員... – 2014-10-30 08:30:59

+0

@MichalHosala:該問題中的原始代碼錯過了'()',因此它看起來像一個數據成員。 – 2014-10-30 08:33:00

+0

哎呦......我匆匆匆匆地瞥了一眼這個。認爲isMouseOverYard是一個變量。我會刪除我的答案。 編輯:@JohnZwinck解釋它... – JorenHeit 2014-10-30 08:33:19

1

這兩個選項是蠻好的,選項2更好,因爲配套的方法可以是私有的類,從別人隱藏的,由私人侷限和訪問類成員

1

它並不真正的問題。我會留下它protected,因爲它在未來會更加靈活,無論如何這是一種常量方法,所以如果有人「誤用」它,不會冒任何過多的損害風險。

相關問題