允许类访问单个私有成员

Allow class access to single private member

本文关键字:成员 单个私 访问 许类      更新时间:2023-10-16

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

是否有一种方法使a的a()对B可访问?

有一种方法——如果你的类有一个公共模板函数:

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;
    }

我必须承认我是从gottw那里偷来的

没有,但是当您指定确切的类时,只有B可以访问A的私有成员。你只需要注意调用了什么方法。

由于朋友关系是不可继承的,所以你不必担心B可能有子类

这可以通过一些"扭转"来实现。

将方法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'
    }
};

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