回答
如果容器的狀態是類的不變量的一部分,那麼它應該在可能的情況下是私有的。
例如,如果容器表示三維向量,那麼不變量的一部分可能是它總是包含3個數字。將它公開爲公共成員將允許類外部的代碼更改容器大小,這反過來可能會導致需要容器大小不變的任何例程出現問題。保持容器的私密性,限制軟件中容器大小可以修改爲類的成員函數的地方。
一個成員是否被宣佈私人或公衆完全取決於你的應用程序。你能否提供更多細節?
聲明你的成員時要記住的一點很重要,如果你提供一個「getter」來檢索它,那麼你就不再封裝那個對象。相反,編寫包裝方法會很好,只會暴露您想要公開的功能。
例如,對於Vector成員,如果這是您希望公開的所有功能,則可以編寫AddItem和Clear方法。
使所有成員保持私有狀態並使用訪問方法,這允許您稍後更改實現。只有在非常不尋常的情況下,我纔會公開任何數據成員。
請記住,chaning實現發生的次數比您想象的要多,它不僅僅是更改容器類型的一種情況,也許您想更改機制。假設您將名稱存儲在列表中,過了一段時間,您可能選擇使用散列索引此列表,並希望每次添加新名稱時都更新散列。如果你的實現被適當的封裝,這樣做很容易,如果你剛剛暴露了矢量,你需要進行修改來調整接口(所以變化會波及)。
如果這是新新的,你有一個讀:http://en.wikipedia.org/wiki/Encapsulation_(classes_-_computers)
還有第三種辦法 - 有時是更好地從容器中繼承和重寫它的方法來實現自己的目標(例如線程安全) 。無論如何,將其公開幾乎總是不是一個好主意。
STL容器沒有虛擬析構函數或虛方法,所以這可能是危險的領域。 – bk1e 2008-10-15 06:13:21
考慮到您希望將容器封裝在另一個類中,這意味着它不能公開,並且您的類的公共方法不應公開任何有關容器的實現特定。這樣,您的類(即容器)的實現可以在不更改其接口的情況下進行更改。
既然你在談論一個班級,我認爲它應該是私人的。如果你希望它是公開的,而不是創建一個結構體 - 顯而易見,你希望使用成員變量。
公開vector
成員的可行替代方案是創建訪問者函數(或內部迭代器)。這樣你就更好地遵守德米特法則:
class ContWrapper {
std::vector<int> _ints;
public:
class Action {
public:
virtual void accept(int i) = 0;
};
void each_int(Action& a);
};
另外,在輸出來自庫的std::vector<T>
:客戶端代碼可能不會使用與您一樣的STL實現,因此這些成員變量的佈局可能會有所不同!
- 1. 公共類,但私有成員變量?
- 2. 私人課程中的公共成員
- 3. 公共屬性和私人成員C#
- 4. 如何使用公共屬性設置私人成員的值?
- 5. 私人和公共變量
- 6. 公共和私人訪問爲相同的成員函數
- 7. 公共類成員或方法返回一個私人成員的引用?
- 8. 公共/私人
- 9. 將成員從公共更改爲私人
- 10. 公共類成員的NullReferenceException
- 11. JavaScript的私人和公共職能和成員
- 12. javadoc所有 - 私人,公共和受保護的成員
- 13. 公共/私人成員/功能風格的順序?
- 14. PHP json_encode類私人成員
- 15. 如何設計一個C++類而不將std :: vector作爲公共成員?
- 16. 設置一個公共屬性作爲私人
- 17. 作爲私人成員的類類型,MVP?
- 18. 私人與公共的typedef
- 19. VS2012 - 類接口設計:私人成員功能定位/隱藏
- 20. Python類和公共成員
- 21. 有沒有辦法從CoffeeScript類中的私人函數訪問公共成員
- 22. 爲什麼要在課堂上爲私人成員創建公共包裝?
- 23. 如何訪問私有包類的公共成員?
- 24. 選擇一個功能的成員,非會員,私人,公共等
- 25. 如何讓基礎班的私人成員成爲兒童班的公共成員?
- 26. GitHub - 私人與公共合作伙伴
- 27. 私人和公共財產
- 28. 私人與公共繼承
- 29. 私人和公共職能
- 30. 推送私人或公共?
聞起來像功課... – JohnMcG 2008-10-13 13:43:13