允许类访问单个私有成员
Allow class access to single private member
我有一个类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();
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- OOP 中的单成员指针
- 是否可以单步执行.dll文件中定义的成员函数?
- 为什么调用单例类 Qt 消息处理程序成员函数会出现错误:缺少参数列表
- 正在初始化单例的常量成员变量
- 非静态成员变量创建,如C++中的静态单例创建
- 具有矢量成员的单例应用程序
- 如何防止成员 QWidgets 或 QDialog 对象在鼠标单击对话框后从 QMainWindow 接管关键事件
- 灵气属性传播问题与单成员结构.
- 指针成员的 C++/CLI 包装器 - C++ 单例实例
- 具有单参数模板的成员函数包装器
- 具有可变成员的单例对象
- 非静态成员引用必须相对于特定的c++对象单例类
- 单例类的成员变量的生存期是多少?
- 如何/应该在Qt中创建ui表单和数据成员之间的自动链接
- 如何解决 C2248:无法访问在单例类中声明的私有成员
- 将单例类型定义为成员变量