2013-04-30 99 views
0

假設我們是在這種情況下:C++私有數據成員訪問:良好做法

class C { 
    int a, b; 
public: 
    C(int aa, int bb) { 
     setA(aa); 
     setB(bb); 
    } 
    void setA(int aa) { a = aa; } 
    int getA() { return a; } 
    void setB(int bb) { b = bb; } 
    int getB() { return b; } 
    C add(const C c1, const C c2); 
}; 

如果add()我需要訪問的數據成員,這是做的最好的方法是什麼?我應該使用訪問功能setget(爲客戶端程序員創建),或者我可以簡單地使用數據成員(c1.a,c1.b,c2.a,c2.b),因爲我是類設計師?

+3

您是否打算添加'虛擬'? – 2013-04-30 11:13:30

+0

在構造函數中,不需要調用set函數。直接設置'a = aa'和'b = bb' – tianz 2013-04-30 11:15:10

+0

@Koushik So.他做什麼都沒有違法。 (有一些可疑的問題,比如'add'函數有三個參數,或者'const C'在忽略const的上下文中,或者對於所有成員都有getter和setter ) – 2013-04-30 12:38:34

回答

5

您可以使用。這取決於你希望你的setter/getters是那樣,還是有一些額外的功能。例如,獲取者也可能更新一個該成員被訪問次數的計數器,因此通過獲取者訪問它們,即使是在類中,也可能更有意義。

無論哪種方式,這不是設計中最重要的部分。您首先需要了解封裝的真正含義。讓成員private和提供getter和setter不會比首先將它們設置爲public(好吧,對於調試目的來說它更好,但在概念上它是相同的)。

你真的需要它們嗎?

此外,獲得者應該製作const,你應該通過c1c2const參考。

+0

'讓成員**私人**'並提供getter和setter並不比讓它們在第一位公開更好......'如何在不使用getter的情況下訪問私人成員?友誼?但友誼打破'封裝'!我不明白你的觀點。 – Mushy 2013-04-30 13:25:18

+0

@Mushy如果它們是公開的,你可以直接訪問它們。我的觀點是私人成員加上吸氣劑和封送劑也破壞封裝。 – 2013-04-30 13:30:27

+0

如果他們是'private',那麼如果他們不使用'getters'或者在不使用'setters'的情況下修改它們,如何訪問它們?如果「封裝領域」並不比公開成員更好,排除友誼,他們是如何獲得的? – Mushy 2013-04-30 13:33:49

2

請直接使用它。設置/獲取是從課外訪問成員。

1

由於add是類的成員函數,因此您可以直接訪問私有數據成員。通常設置和獲取功能用於客戶端訪問。

1

在這個特殊的例子中,我直接使用變量名。

但也有類似的情況,吸氣/安裝人員更多的使用。

例如,當二傳手(或吸氣)功能不僅僅是瑣碎x = y更加複雜:

void SetA(int aa){ //a between 0 and 100 
    a = std::max(0, std::min(aa, 100)); 
} 

或者當你要繼承C和超負荷的getter/setter或add功能。