2012-11-05 65 views
-1

爲了簡化我的問題,我有這樣的事情:派生類的朋友可以訪問什麼變量?

class Base { 

private: 

protected: 
    int a,b; 
    string c; 

public: 
    [some functions here] 

} 

class Derived : public Base{ 

    [some variables and functions] 

friend void function(); 

} 

void function(){ 

int d[a][b]; 
[stuff] 

} 

基本上,我的void函數需要訪問的東西,是在受保護類的基類的。我想保留在受保護的部分中定義的變量。反正有功能,它必須融入Derived類,才能訪問a和b?

+2

這應該做工精細;當你嘗試時會發生什麼? – ecatmur

+0

它告訴我a和b沒有在範圍 – user1799323

回答

0

您可以在Derived中定義私有方法:Derived中的任何方法都可以訪問Base的受保護成員。

函數是Derived的一個朋友,因此它可以調用Derived中的私有方法,該方法又訪問Base的受保護成員。


編輯回覆註釋下面

get_a()構件方法和a構件數據是它們的類的成員。這些成員的實例存在於它們的類的實例中。除了在實例中它們不存在,所以要訪問它們,您需要通過類的實例訪問它們。

例如,這樣的事情:

class Derived : public Base{ 

    [some variables and functions] 

    friend void function(Derived& derived); 
}; 

void function(Derived& derived) 
{ 
    int a = derived.get_a(); 
    int b = derived.get_b(); 
    // I don't know but even the following might work 
    int c = derived.a; // able to access field of friend's base class. 
} 

void test() 
{ 
    Derived* derived = new Derived(); 
    function(*derived); 
    delete derived; 
} 
+0

中聲明嗯,你是說「friend void function();」線應該在Derived類的「Private:」下面? 「派生類:公共基礎{ 私人: – user1799323

+0

嗯,所以我在派生類的私有部分寫了兩個功能 INT get_a(){ 返回; } int get_b(){ return b; ] public: friend void function(); (){ } void function(){ int a = get_a(); int b = get_b(); }' 但是,這仍然告訴我,get_a和get_b超出了範圍。任何想法有什麼不對? – user1799323

+0

@ user1799323我通過編輯我的答案回覆了您的評論。 – ChrisW

0

你的功能需要通過推斷爲類的實例來訪問a和b如下

void function() 
{ 
Derived objectDerived; 
int d[objectDerived.a][objectDerived.b]; 
[stuff] 
} 
相關問題