2013-04-13 62 views
4

我知道類中的數據應該是私有的,然後使用getter和setter來讀取/修改它們。但與使用直接存儲一個成員函數的student.scores.push_back(100)相比,這不是很麻煩。我必須使數據保密嗎?

class Student { 
public: 

    void addToScores(int inScore) { 

     scores.push_back(inScore); 
    } 

private: 

    vector<int> scores; 
} 

總之,我很好奇人們究竟在實踐中做什麼,總是嚴格的私人數據與getter和setter?

+0

嘗試設計您的類接口,然後再考慮您的類可能具有哪些類型的數據成員。那麼你不必問這個問題。 –

+1

沒有人被迫寫出體面的代碼。相信我。 –

回答

4

成員函數的用途是公開一個接口。沒有必要讓getter和setter或其他簡單的函數簡單地將已經由成員實現的接口移動到聚合容器對象。

如果Student的客戶端應該被允許操縱scores但是他們想要,您應該讓scores成爲公共成員並以簡單的方式訪問它。如果應該是隻有push,poptop的堆棧,請使用std::stack接口適配器。如果只允許push_back,那麼您可以實施addToScores。但是,如果唯一的客戶是你,並且你不擔心接口的其他部分被濫用,那麼實現一個新的接口是沒有意義的。

程序中的每個接口都應該精心設計。添加slapdash接口是一種習慣,因爲標準接口(包括C++默認賦值運算符)是「危險的」並不一定是一個好習慣。

2

實際上,人們使用類來定義新的數據類型,並使用獨立於數據成員的新語義。訪問者和公共數據成員都不使用,而是提供成員函數來執行與新數據類型相關的任務,同時在數據成員上維護不變量。

當然,有時人們編寫的類只是數據聚合,沒有額外的語義。在這種情況下,填寫公共成員的struct是適當的。

0

如果它是一個簡單的讀/寫,您並不需要使數據保密。但是,如果您需要對正在讀取/寫入的數據進行驗證/條件檢查,那麼將其視爲私有是有意義的。

2

使用Get/Set方法的一個基本原因是控制除數據封裝外的輸入類型。

如果你不想採取一些特定的輸入類型,比如說你可能不想要一個超出[0,100]區間範圍的分數,那麼你可以在Set方法中檢查這個條件,以便庫用戶不能一個不合邏輯的操作。

相關問題