2014-12-19 88 views
0

如果我有一個類:訪問私有變量對象

class A { 
public: 
    A(); 
    ~A(); 

    int something(); 
} 

class B { 
public: 
    B() {a = new A();}; 
    ~B(); 
private: 
    A *a; 
} 

main() { 
    B x; 
} 

就是使用目標的唯一途徑「一」的主要是有這方面的吸氣劑?

class B { 
public: 
    A getA() {return *a;}; 
private: 
    A *a; 
} 

然後,如果我想設置私人變量對象,我需要一個setter,並將它設置爲main?

編輯:我更新的類A,B,主要一點。主要問題是,如果我在main中創建B的對象,最好的方法是什麼。我是否可以訪問函數「something()」,因此信息可以存儲在私有變量「a」中?我知道我不能做x.a.something(),因爲「a」是私人的。

+3

也許你需要一個C++的書,而不是一個常見問題? – 2014-12-19 00:16:23

+0

[爲什麼使用getter和setter?]的可能重複(http://stackoverflow.com/questions/1568091/why-use-getters-and-setters) – Pradhan 2014-12-19 00:17:23

+0

或者,使變量公開。還要注意:'inline'規範是多餘的,你正在製作不必要的對象副本,getter通常有一個mutable和一個'const'版本,你應該使用智能指針,你違反了三條規則。 – 2014-12-19 00:17:25

回答

2

「在main中使用對象」a「的唯一方法是爲它設置一個getter?

是的。

「然後,如果我想設置私有變量對象,我需要一個setter,並將它設置爲main?」

答案仍然是:是的。

使一個類的成員變量private的目的是將數據封裝到類,並進行訪問只能使用該類別的成員函數可行。最簡單的一種功能部件是吸氣設定器成員函數。
他們似乎是換一個天真一點很沒用(至少你可以簡單地用一個public類的成員變量,而不是)。但是封裝意味着你不需要改變任何東西,如果事後證明,你會例如需要調查爲該成員設置新值,可能需要觸發重新計算或對其他類成員變量進行的任何操作。


類聲明應該像如下(你並不需要經常使用的A*指針)

class A { 
}; 

class B { 
public: 
    B() : a_() {} 
    const A& a() const { return a_; } // Getter 
    void a(const A& newValue) { a_ = newValue; } // Setter 
private: 
    A a_; 
}; 

而且使用它

int main() { 
    A a; 
    B x; 

    x.a(a); // Set the value 
    a = x.a(); // Get the value 
} 

要延長您編輯:

「我可以訪問功能something()反正這樣的信息可以存儲在私有變量a?我知道我不能這樣做x.a.something()因爲a是私人的。「

不能從古典吸氣功能直接訪問功能(如我上面提出的)像

x.a().something(); 

因爲something()不是A類的const成員函數

要允許操作,您需要聲明返回非const引用的getter(實際上會破壞所提到的封裝規則,並且氣餒,因爲這):

A& a() { return a_; } // Getter 

B類提供了一個成員函數,即調用適當的代表:

class B { 
public: 
    // like all of my proposal from above ... 

    int doSomething() { 
     return a_.something(); 
    } 
private: 
    A a_; 
}; 
+0

downvoter能解釋這個答案的實際錯誤嗎? – 2014-12-19 00:24:48

+1

@Deduplicator更多解釋,爲什麼封裝從一開始就有意義。我沒有看到真正的缺點,相對於使用公共成員變量(除了呈現真實的POD之外,這些很少通過代碼審查),但我期望看到'struct'而不是'class')。 – 2014-12-19 00:36:22