2011-03-11 47 views
4

我有一個我打算讓別人繼承的類。它有一個std :: vector,我只希望開發人員能夠讀取,但不能修改,我的基本功能修改它。我應該提供一個返回一個常量迭代器的函數,或者將該向量暴露爲protected。我應該公開受保護的std :: vector嗎?

謝謝

+2

經驗法則:不要暴露數據成員,甚至不要受到保護。 – 2011-03-11 13:35:46

回答

9

如果您將載體公開爲受保護的,子類將能夠對其進行修改。所以,你應該公開返回const迭代器的方法。

您可以使用Non-Virtual Interface idiom爲用戶和子類公開不同的接口。

4

如果你保護它,那麼你就失去了保護,因爲任何子類都可以將它改爲public,並讓其他人修改它。

爲什麼不提供const引用?如果返回const iterator,則可能需要重寫很多接口,包括開始,結束,大小等。

1

如果您不希望派生類修改向量,那麼我認爲答案很簡單:提供函數返回只讀迭代器!

返回迭代器也封裝了基類,這顯然是一個好主意。

0

缺點爲使其保護:不能輕易改變到不同的容器,在允許的操作失控,編碼到執行,而不是接口,更難以遏制測試

缺點的函數返回迭代器:一點點額外的打字(可能少於它問這個問題)

似乎是一個明顯的答案給我。

相關問題