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