我有一個類A具有一個名爲a()的私有方法。我也有一個B類需要訪問一個()(但只是B應該有權訪問一個(),這就是爲什麼一個()是私人的)。我現在可以使用一個朋友說明符,但這會使A的其他私有方法(讓我們稱它們爲b()和c())也可用於B,而我不希望這種行爲。允許類訪問單個私人成員
有沒有一種方法可以使A的A()成爲B的訪問權限?
我有一個類A具有一個名爲a()的私有方法。我也有一個B類需要訪問一個()(但只是B應該有權訪問一個(),這就是爲什麼一個()是私人的)。我現在可以使用一個朋友說明符,但這會使A的其他私有方法(讓我們稱它們爲b()和c())也可用於B,而我不希望這種行爲。允許類訪問單個私人成員
有沒有一種方法可以使A的A()成爲B的訪問權限?
不,沒有,但是當您指定精確的班級時,只有B可以訪問A的私人成員。 你只需要注意調用什麼方法。由於朋友關係不會被繼承,所以您不必擔心B的可能子類。
嗯,我已經懷疑,雖然 – Paranaix 2012-01-02 12:40:55
這可以通過一些「扭曲」來完成。
只是將A類中的方法a()從A類中分解出來,並將其作爲具有B作爲朋友類的父類,然後讓A繼承它。這將留下一個()爲在A中的方法,但其母公司的朋友B.
訪問的唯一的私有方法在這裏是一個非常簡單的代碼來澄清我說:
class parent
{
friend class B;
private:
void a() {}
};
class A:public parent
{
private:
void b() {}
void c() {}
};
class B
{
A* m_a;
public :
B()
{
m_a = new A();
m_a->a(); // OK
m_a->b(); // error C2248: 'A::b' : cannot access private member declared in class 'A'
}
};
希望能幫助到你 !
0123.雖然可以如果父項中的私有函數不是獨立的並且需要訪問A(w這很常見)。查看Asaf提供的鏈接。有一個很好的解決方案;這就是爲什麼我接受這個問題。 – Paranaix 2012-01-02 13:03:34
是的,我有一個簡單的方法。假設B有A的一個::()的指針,就像這樣:
typedef boost::function<void()> functype;
class A {
private:
void a();
};
class B {
public:
void setfp(functype f) {m_f = f;}
void foo() {
// do some stuff
m_f();
}
private:
functype m_f;
};
A a;
B b;
b.setfp(boost::bind(&A::a, &a));
b.foo();
乍看之下,這存在一些問題。由於'A :: a'是私有的,所以你對'setfp()'的調用將不會被編譯。這讓你回到方形1.同時,雖然(幾乎)允許私人成員進入部分訪問,但它現在將其提供給任何人,而不僅僅是「B」。所以我沒有看到OP如何實際使用這個解決方案來實際解決問題。 – tenfour 2012-01-02 14:54:52
有一個辦法 - 如果你的類有一個公共的模板函數:
class A {
// apparently private
void priv() { std::cout << "got you A::a()" << std::endl ; }
public:
template <class T>
void abuse() {}
};
struct Thief {};
template <>
void A::abuse<Thief>() {
this->priv();
}
int main() {
A a;
// obviously do not compile : a.priv();
// this i OK
a.abuse<Thief>();
return 0;
}
我必須承認,我偷了這從GotW ...
看到這個問題:http://stackoverflow.com/questions/1609472/friend-class-with-limited-access – Asaf 2012-01-02 12:42:02