首先我想講清楚這個問題涉及到斯科特邁爾斯的書有效的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
}
這是它必須完成的方式嗎?複製的性能不是很難(如果相當頻繁地完成)?
我想這可能是我的設計錯了。
你正在推翻這一點。斯科特邁爾斯建議最佳做法,而不是法律。如果派生類可以訪問_thing而不管什麼(並且你不需要任何getter邏輯),只需使該成員本身受保護。 – denniskb
我認爲你是正確的,答案(接受它)提供了一種處理它的方式。但是真的只會變得更加難以理解,並且使用它是一場噩夢,至少如果你必須對它做非const的東西,那麼你將不得不提供一個非const引用,這顯然是一個很大的比擁有受保護的成員更糟糕的想法。我認爲這裏的關鍵是指出我是過度思考的受害者,這有助於我對解決方案感到滿意。 – qrikko