一个成员函数(相对于整个类)是否可以与一个函数/类成为朋友
Can a member function (as opposed to the entire class) befriend a function/class?
函数F可以被声明为类C的朋友,这样它就可以访问整个类的私有和受保护成员。
但是有没有一种方法可以允许F只访问C的特定成员函数,而不是允许F访问整个类?
这就是我想这么做的原因。
不,你不能。
一种解决方法是将特定的成员函数放在一个单独的类C2中,C从中继承,并建立与C2的友谊。
没有办法直接用友谊来做到这一点,但你可以通过修改基于标签的调度来实现类似的效果:
class C
{
public:
class AccessTag
{
friend class C;
friend void F();
private:
AccessTag() {}
};
void functionToAccess(AccessTag)
{
std::cout << "Restricted function called!n";
}
};
void F()
{
C c;
c.functionToAccess(C::AccessTag()); // OK
}
void nonF()
{
C c;
c.functionToAccess(C::AccessTag()); // error, nonF cannot access ctor of C::AccesTag
}
其思想是只允许那些能够构造C::AccessTag
对象的人调用functionToAccess
。由于C::AccessTag
是私有的构造函数,它只能由它的朋友来构造。它们是C
(这样它就可以调用functionToAccess
本身,就像调用它的任何其他私有函数一样)和F
。F
不能访问C
的任何其他非公共成员,因为它不是C
的朋友。
您甚至可以为不同的成员函数(或成员函数组)使用不同的访问标记。
相关文章:
- 函数向量_指针有不同的原型,我可以构建一个吗
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 如何仅为一个函数添加延迟
- 构造函数正在调用一个使用当前类类型的函数
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错
- 有一个打印语句的函数是一种糟糕的编程实践吗
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 输入到文件并输出到另一个文件,并将流文件传递给函数
- 我不明白为什么我声明一个空的内部结构并将其传递给构造函数
- 如何创建函数管道,以便函数一个接一个地运行?
- 如何巧妙地编写两个函数——一个用于检查是否存在解决方案,另一个用于获取所有解决方案
- 在c++中的复制构造函数/一个声明语句中的初始化的延续中使用chain方法
- C :基类调用自己的虚拟函数 - 一个反图案
- 如何在这个交换函数(一个单独的链表)中找到错误
- 两个相同的函数(一个使用模板模式,另一个不使用)
- 你怎么能一次给一个函数一个参数呢
- 为什么要做两个函数?(一个是非const,另一个是const)
- 当代码在其他地方使用时,如何保证函数一个接一个地被调用