2012-01-02 46 views
3

我有一個類A具有一個名爲a()的私有方法。我也有一個B類需要訪問一個()(但只是B應該有權訪問一個(),這就是爲什麼一個()是私人的)。我現在可以使用一個朋友說明符,但這會使A的其他私有方法(讓我們稱它們爲b()和c())也可用於B,而我不希望這種行爲。允許類訪問單個私人成員

有沒有一種方法可以使A的A()成爲B的訪問權限?

+3

看到這個問題:http://stackoverflow.com/questions/1609472/friend-class-with-limited-access – Asaf 2012-01-02 12:42:02

回答

1

不,沒有,但是當您指定精確的班級時,只有B可以訪問A的私人成員。 你只需要注意調用什麼方法。由於朋友關係不會被繼承,所以您不必擔心B的可能子類。

+0

嗯,我已經懷疑,雖然 – Paranaix 2012-01-02 12:40:55

0

這可以通過一些「扭曲」來完成。

只是將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' 

    } 
}; 

希望能幫助到你 !

+0

0123.雖然可以如果父項中的私有函數不是獨立的並且需要訪問A(w這很常見)。查看Asaf提供的鏈接。有一個很好的解決方案;這就是爲什麼我接受這個問題。 – Paranaix 2012-01-02 13:03:34

0

是的,我有一個簡單的方法。假設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(); 
+0

乍看之下,這存在一些問題。由於'A :: a'是私有的,所以你對'setfp()'的調用將不會被編譯。這讓你回到方形1.同時,雖然(幾乎)允許私人成員進入部分訪問,但它現在將其提供給任何人,而不僅僅是「B」。所以我沒有看到OP如何實際使用這個解決方案來實際解決問題。 – tenfour 2012-01-02 14:54:52

4

有一個辦法 - 如果你的類有一個公共的模板函數:

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 ...