2008-10-13 53 views

回答

1

如果容器的狀態是類的不變量的一部分,那麼它應該在可能的情況下是私有的。

例如,如果容器表示三維向量,那麼不變量的一部分可能是它總是包含3個數字。將它公開爲公共成員將允許類外部的代碼更改容器大小,這反過來可能會導致需要容器大小不變的任何例程出現問題。保持容器的私密性,限制軟件中容器大小可以修改爲類的成員函數的地方。

1

一個成員是否被宣佈私人或公衆完全取決於你的應用程序。你能否提供更多細節?

聲明你的成員時要記住的一點很重要,如果你提供一個「getter」來檢索它,那麼你就不再封裝那個對象。相反,編寫包裝方法會很好,只會暴露您想要公開的功能。

例如,對於Vector成員,如果這是您希望公開的所有功能,則可以編寫AddItem和Clear方法。

0

使所有成員保持私有狀態並使用訪問方法,這允許您稍後更改實現。只有在非常不尋常的情況下,我纔會公開任何數據成員。

請記住,chaning實現發生的次數比您想象的要多,它不僅僅是更改容器類型的一種情況,也許您想更改機制。假設您將名稱存儲在列表中,過了一段時間,您可能選擇使用散列索引此列表,並希望每次添加新名稱時都更新散列。如果你的實現被適當的封裝,這樣做很容易,如果你剛剛暴露了矢量,你需要進行修改來調整接口(所以變化會波及)。

如果這是新新的,你有一個讀:http://en.wikipedia.org/wiki/Encapsulation_(classes_-_computers)

0

還有第三種辦法 - 有時是更好地從容器中繼承和重寫它的方法來實現自己的目標(例如線程安全) 。無論如何,將其公開幾乎總是不是一個好主意。

+0

STL容器沒有虛擬析構函數或虛方法,所以這可能是危險的領域。 – bk1e 2008-10-15 06:13:21

0

考慮到您希望將容器封裝在另一個類中,這意味着它不能公開,並且您的類的公共方法不應公開任何有關容器的實現特定。這樣,您的類(即容器)的實現可以在不更改其接口的情況下進行更改。

1

既然你在談論一個班級,我認爲它應該是私人的。如果你希望它是公開的,而不是創建一個結構體 - 顯而易見,你希望使用成員變量。

公開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實現,因此這些成員變量的佈局可能會有所不同!