2015-11-06 108 views
0

我是新來的C++,我需要從一個類的私有類成員這是在不同的類,例如一個方法來讀取:閱讀私有變量的類成員

class a{ 
private: 
int x; 

} 

class b{ 
void foo(); 
} 

void b::foo(){ 
//here I want to read from x that's in a 
} 

我必須設置像int readx(){return x);)a readclass(){return *this);}class a的功能?有另一種方法嗎?

+0

您可以使用可訪問x的朋友函數。 –

+3

你應該考慮它可能被宣佈爲私人的原因。 –

+0

@NeilKirk:對,例如如果這個班級的設計人員考慮到能夠稍後將其擴展用於多線程環境,那麼未經審計的狀態訪問就是一個遊戲殺手。 –

回答

3

一類的私有部分具有「隱藏」的目標,你處理數據的方式,提供accesing的精簡的方式表示,與公共方法的數據。 使用公共方法來改變私有成員的值的優點是,可以,例如,只允許對之間的「x」在0和10個值。

在你的情況,你應該想想確實在第一類的「x」表示,如果是有意義的,第二類直接,沒有任何控制或特殊考慮訪問它。如果是這種情況,那應該是公共價值。在另一種情況下,您需要制定公開的方法來閱讀它,例如您的readx示例。 如果只有'b'纔有權直接訪問'x',那麼您也可以像之前說過的那樣定義好友功能。

注意returnig的指針實例將不會允許訪問類的私有成員。

1

你可以使用友元類或函數,但它是一個壞主意,使用的方法私有成員(測試僅適用於合理辯解)。如果無法避免使用私有成員,最好使用公共方法或重新設計代碼。

1

您可以實現在FOO訪問X友元函數。

Reference

+0

你應該發佈更多,因爲鏈接可能會在未來消失。 –

1

如果沒有訪問到這個類的數據成員一個,那麼你應該申報B類的成員函數作爲類的友元函數。

例如

#include <iostream> 

class B 
{ 
public:  
    void foo() const; 
}; 

class A 
{ 
public: 
    A(int x) : x(x){} 
private:  
    friend void B::foo() const; 
    int x; 
}; 

void B::foo() const 
{ 
    A a { 10 }; 
    std::cout << a.x << std::endl; 
} 

int main() 
{ 
    B().foo(); 

    return 0; 
} 
+0

':x(x){}'那是什麼? – shinzou

+0

@kuhaku這就是所謂的ctor初始化。表達式x(x)在冒號後用參數x的值初始化數據成員x。 –

1

聲明一個friend函數或類將授予讀寫訪問的X到函數或類,一

class a { 
public: 
    const int& readx() const { return x; } 
private: 
    int x 
}; 

,或者,如果你喜歡的是語義更好

class a { 
public: 
    const int& x() const { return x_; } 
private: 
    int x_; 
}; 

授予讀只能訪問,但對每個客戶。

+0

爲什麼函數的名字後面是const? – shinzou

+0

@kuhaku第一個'const'確保只讀訪問(介意它是一個ref,不是返回的值),第二個允許在'const a'實例上調用它。除了C++(和C)中的一個一般經驗法則是成語** const作爲const can ** ** - 不打算需要可變的東西,也應該總是聲明爲 - const,即。 –