我有一个 A 类,它有一个名为 a() 的私有方法。我还有一个需要访问 a() 的 B 类(但只有 B 应该可以访问 a(),这就是为什么 a() 是私有的)。我现在可以使用朋友说明符,但这会使 A 的其他私有方法(我们称它们为 b() 和 c())也可用于 B,我不希望这种行为。
有没有办法让 B 可以访问 A 的 a()?
我有一个 A 类,它有一个名为 a() 的私有方法。我还有一个需要访问 a() 的 B 类(但只有 B 应该可以访问 a(),这就是为什么 a() 是私有的)。我现在可以使用朋友说明符,但这会使 A 的其他私有方法(我们称它们为 b() 和 c())也可用于 B,我不希望这种行为。
有没有办法让 B 可以访问 A 的 a()?
有一种方法——如果你的类有一个公共模板函数:
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 那里偷来的……
不,没有,但是当您指定精确的类时,只有 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();