2016-05-14 50 views
1

首先我想講清楚這個問題涉及到斯科特邁爾斯的書有效的C++(第3版),特別項目22:申報數據成員的私人多態性與私有數據成員

我做大部分時間理解它,並試圖將一些東西應用到我的代碼中以開始練習它。不過,我有一個情況,我不知道如何解決它。基本上我有一些抽象接口和繼承看起來像這樣。

class abstractSystem { 
    ... 
protected: 
    AbstractThing *_thing; 
} 

class DerivedSystem : public AbstractSystem { 
    // inherits _thing so we can use it here. 
} 

然而,這是不連貫項22.我想,最好是有派生類的基類的接口,並且自多態性是這部作品在很多情況下不是很好,但在這種情況下,用於決定_thing我們將在一個getter中複製它,以便在任何時候我們需要訪問它的派生系統中,我們需要複製它。

所以我猜測這是不是很大,而且是一致的,以項目28:避免返回「手柄」物體內部我似乎無法弄清楚如何做到這一點不復制_thing

class AbstractSystem { 
protected: 
    AbstractThing thing() { return *_thing; } 
private: 
    AbstractThing *_thing; 
} 

class DerivedSystem { 
    // now we need to use thing() to access _thing implying copy 
} 

這是它必須完成的方式嗎?複製的性能不是很難(如果相當頻繁地完成)?

我想這可能是我的設計錯了。

+1

你正在推翻這一點。斯科特邁爾斯建議最佳做法,而不是法律。如果派生類可以訪問_thing而不管什麼(並且你不需要任何getter邏輯),只需使該成員本身受保護。 – denniskb

+0

我認爲你是正確的,答案(接受它)提供了一種處理它的方式。但是真的只會變得更加難以理解,並且使用它是一場噩夢,至少如果你必須對它做非const的東西,那麼你將不得不提供一個非const引用,這顯然是一個很大的比擁有受保護的成員更糟糕的想法。我認爲這裏的關鍵是指出我是過度思考的受害者,這有助於我對解決方案感到滿意。 – qrikko

回答

1

你可以參考返回到「東西」:

protected: 
    AbstractThing const& thing() { return *_thing; } 

這將避免複製整個對象。

+1

是的,它解決了這個問題,或者它在許多方面都會**,但是它也是不連貫的。*項目28:避免返回「句柄」對象內部*。 – qrikko

+1

對,我的示例返回一個常規引用​​將被視爲一個句柄。然而,我認爲返回一個const引用會符合項目28的精神。我相應地改變了我的答案。 – mikero

+0

是的,我認爲這樣做會很好,對於懸掛手柄*的風險有一些觀點,但由於這是繼承,我覺得在這方面它應該是相當可靠和可預測的。 – qrikko