2014-07-22 27 views
0

什麼是首選的C++風格,使用getset函數來獲取和設置成員變量的值,或者僅使該成員變量爲public?使用獲取函數與創建成員變量public

class MyClass 
{ 
public:  
    std::string getValue(); 
    std::string setValue(); 
private:  
    std::string value; 
}; 

class MyClass 
{ 
public: 
    std::string value; 
}; 

第二個看起來更乾淨,我實在看不出任何優勢,第一個,除了讓你更多的錢,如果你被代碼行支付。

+4

第一個不允許修改。 – chris

+1

第一種方法的優點是它不暴露對象的(可變)實現和私有狀態。 –

+0

嗯,如果我想進行更改,我還可以包含'std :: string setValue();'函數。我應該澄清一點。 – Lighthat

回答

4

我實在看不出任何優勢,第一個,不是讓你更多的錢,如果你被代碼行支付等。

通過這個推理,第二種方法可能會給你更多的錢,因爲維護成本。

想象一下,有一天你會改變value從其他成員計算。擁有一個getter可以很容易地添加這個行爲而不會影響代碼庫。

存儲在每個實例中的string值應該是實現細節,而不是公開可見的API的一部分(至少在理論上是這樣:沒有繼承,成員存在的事實對任何用戶都是可見的)。這是令人討厭的,必須寫下樣板吸氣劑和定型劑,但從長遠來看,它會帶來回報。

很多時候,具有太多setter和getter對的類有其他設計缺陷並且通常太多可變狀態。另外,在C++中,如果一個具有數千個getter/setter對的類只保存狀態並且根本沒有定義行爲,它應該是struct

+0

但是改變實現來實時計算'value'會導致setter(已經是接口的一部分)無用。 – John

+0

的確如此 - 也許這套裝置從未被使用過,而且可以更安全地移除。雖然編輯。 –

+0

@Alex要說清楚的是,當你說「具有太多setter和getter對的類有其他設計缺陷時」,你不是故意暗示使用getter和setter本身就是一個設計缺陷,對嗎? – Lighthat

4

它不是很好的「向世界展示」對象的膽量。稍後您可能想要更改課程實施,或者甚至可以讓您的不是std::string

隨着項目的發展,很多事情都可能發生變化,當然,您可以稍後添加getValue,但在這種情況下,您將棄用舊的「API」並創建新的項目,這會導致更新等問題。

此外,使公開成員允許用戶讀取/修改此成員,而不通知類本身。這可能會造成「糟糕的設計」問題。

+0

'或者甚至讓你的值不是std :: string' - 在這種情況下如何使用訪問函數可以提供幫助? – Gluttton

+0

@Gluttton一個getter可以將內部類型轉換爲其他類型。 – PSIAlt

1

公共類成員反對封裝,這是面向對象的原則之一。

最常見的約定是不使用單詞get和set,只使用變量名。我們只是讓編譯器決定它是設置還是通過參數存在或不存在來獲取。

成員變量應該以前綴'm_'開頭。

另一種選擇是用一個大寫字母和一個普通的可變啓動該功能的名稱..

本公約所喜歡ImageMagick的多很多開源庫使用。

你的類應該如下:

class MyClass 
{ 
public: 
    void value(const std::string& v){ 
     m_value=v; 
    } 
    const std::string& value()const { 
     return m_value; 
    } 
private: 
    std::string m_value; 
};