允许类访问单个私有成员

时间:2012-01-02 12:35:05

标签: c++ friend private-methods

我有一个A类,它有一个名为a()的私有方法。我还有一个需要访问a()的B类(但是B应该有权访问a(),这就是为什么a()是私有的)。我现在可以使用一个朋友说明符,但这会使A的其他私有方法(让我们称之为b()和c())也可用于B,我不想要这种行为。

有没有办法让一个A()可以访问B?

4 个答案:

答案 0 :(得分: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那里偷走了......

答案 1 :(得分:1)

不,没有,但是当你指定精确的类时,只有B可以访问A的私人成员。 你只需要处理所谓的方法。

由于朋友关系不是继承的,因此您不必担心B的可能子类。

答案 2 :(得分:0)

这可以通过一些“扭曲”来完成。

只需将A类中的方法a()分解为将B作为友元类的父类,然后让A继承它。这将使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'

    }
};
希望它有所帮助!

答案 3 :(得分:0)

是的,我有一个简单的方法。设B有一个A :: 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();