2012-01-02 37 views
1

我有A類和B類.A類有一堆帶有gets/sets的變量,但我只希望從B類調用這些集合。我能想到的唯一方法就是使集合受到保護,從A類派生類B,而隨後的B類最終會從類A.繼承了一堆不必要的東西擁有隻能從另一個類訪問的類方法/變量?

例子:

class A { 
public: 
void setHealth(); 
int getHealth(); 

private: 
int health; 
}; 

class B { 
public: 
void someMethod() { classAInstance.setHealth(); } //This should work 

private: 
A classAInstance; 

}; 

A classAInstance; 
classAInstance.setHealth(); //This should not work because its not being called from Class B 

我希望我解釋我的問題夠你udnerstand什麼我需要。提前致謝!

+2

看看passkey成語:http://stackoverflow.com/questions/6545490/how-can- i-check-a-function-was-called-by-another-function/6545585#6545585 – Xeo 2012-01-02 23:57:42

+1

請查閱您最喜愛的關於* friend *關鍵字的C++語言書籍。 – 2012-01-02 23:59:31

回答

3

你可以聲明制定機構protectedprivate,然後聲明BAfriend

class A { 
    friend class B; 

    ... 
}; 

見C++ FAQ瞭解更多詳情:http://www.parashift.com/c++-faq-lite/friends.html

+0

朋友的麻煩:現在,不需要再調用getters和setter,並且可以直接訪問變量。 – pmr 2012-01-03 00:01:11

+0

@pmr然後只是讓變量私人,受保護的getters/setters和朋友B在受保護的範圍內? – 2012-01-03 00:02:57

+2

@Tom:嗯? 'friend'可以訪問'private'成員,無論你在哪裏放置'friend'聲明。 – 2012-01-03 00:03:57

0

可以使課堂BA的朋友:

class B; 
class A { 
    friend class B; 
    // ... 
}; 
0

B一個的Afriend,從而允許它訪問A的民營(及保護)成員:

class A { 
    friend class B; 
} 
1

如果您希望對A的所有訪問都通過B並強制B不訪問私有數據 而不通過set-/get-成員函數A ...你可以做這樣的事情(儘管它不必要的複雜):

class A 
{ 
    friend class B; 
    void setValue(const int &value) { aData.x = value; } 
    int getValue() const { return aData.x; } 
    class AData 
    { 
    friend class A; 
    int x; 
    }; 
    AData aData; 
}; 

class B 
{ 
public: 
    int getValue() const { return a.getValue(); } 
    void setValue(const int &value) { a.setValue(value); } 

private: 
    A a; 
}; 
相關問題