簡體   English   中英

將向量作為私有/公共成員的類設計?

[英]Class design with vector as a private/public member?

將容器類或其他類作為私有成員或公共成員放入類中的最佳方法是什么?

要求:

1.Vector< someclass> 在我的班級里

2.需要向量的添加和計數接口

成員被聲明為 Private 還是 Public 完全取決於您的應用程序。 你能提供一些更詳細的信息嗎?

在聲明您的成員時要記住的一個重要點是,如果您提供一個“getter”來檢索它,那么您就不再封裝該對象。 相反,編寫包裝方法只公開您希望公開的功能可能會很好。

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

既然你在談論一個班級,我認為它應該是私人的。 如果您希望它是公開的,而是創建一個結構 - 以明確您希望使用成員變量。

暴露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 實現不同,因此這些成員變量的布局可能不同!

如果容器的狀態是類的不變量的一部分,那么如果可能的話,它應該是私有的。

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

將所有成員設為私有並使用訪問器方法,這允許您稍后更改實現。 只有在非常不尋常的情況下,我才會公開任何數據成員。

請記住,更改實現的發生頻率比您想象的要高,這不僅僅是更改容器類型的情況,而且您可能想要更改機制。 假設您將名稱存儲在列表中,一段時間后您可能會選擇使用散列索引此列表,並希望每次添加新名稱時都更新散列。 如果您的實現被適當地封裝,這樣做很容易,如果您剛剛公開了向量,您將需要進行更改以調整界面(因此更改會波及)。

如果這是新手,您可以閱讀: http : //en.wikipedia.org/wiki/Encapsulation_(classes _-_ computers)

還有第三種方法 - 有時最好從容器繼承並覆蓋它的方法以實現您的目標(例如線程安全)。 無論如何,公開它幾乎總是不是一個好主意。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM