如何授予对私有方法的访问权限
How to grant access to a private method
可能重复:
什么是访问说明符?我应该与私人继承、受保护继承还是公开继承?
我正在寻找一些代码或设计模式,以授予对另一个类(C++)的私有方法的访问权限。
假设我有1个班OBJ1:
class OBJ1
{
public:
void method1();
void method2();
}
和另一个类OBJ2,它实例化OBJ1:
class OBJ2
{
public:
void method3()
{
my_obj.method1();
}
private:
OBJ1 my_obj;
}
是否有从其他类访问OBJ2::my_obj.method2()
的方法(仅此方法)?
访问method2
是可能的,因为它是公共的。无法直接访问成员my_obj
,因为它是private
。要授予其他类对它的访问权限,请在OBJ2
中将它们声明为friend
。
class OBJ2
{
public:
void method3()
{
my_obj.method1();
}
private:
friend class X;
OBJ1 my_obj;
}
现在,X
可以访问OBJ2::my_obj
。
您已经回答了自己的问题:看看method3
,它提供了一种通过封闭类OBJ2
在my_obj
上调用method1
的方法。可以添加类似的转发方法以允许访问CCD_ 13。
最好的方法可能是为这个特定函数提供一个公共传递函数,就像您为method3
:所做的那样
class OBJ2
{
public:
void method3()
{
my_obj.method1();
}
void method2()
{
my_obj.method2();
}
private:
OBJ1 my_obj;
}
这稍微改变了语法——您对OBJ2实例调用该方法,而不是直接对包含的OBJ1实例调用,但效果将是您所要求的。
这里的另一个考虑因素是,这种类型的习惯用法(公共包装函数)允许对所包含成员的单个函数进行无限制的外部访问。另一种方法(友元声明)允许单个外部类访问您的整个私有内部。如果您想要的是将单个外部类访问权限授予单个成员,那么您最好使用代理对象或类似的东西来组合这些方法
您需要的是OBJ2
中的一个public
方法,该方法在my_obj
成员上调用method2
。
在这种情况下,friend
飞船不会帮助您,因为它会授予对所有my_obj
的访问权限。
从设计的角度来看,该语言没有提供控制每个成员访问的功能,虽然你可以在其中破解,但它只会使代码更加复杂,更难维护和管理编译器(更复杂的代码意味着更难优化代码)。
如果该成员与其他成员真的不同,并且访问该成员的对象不应访问对象的其余部分,则一些替代方案包括定义一个接口(多态)并在OBJ1
中实现该接口。然后,您可以将引用传递给没有其他成员可用的接口。
从技术角度来看,可以做很多事情,例如,可以创建一个以OBJ1
为参数并调用该方法的访问器函数对象。函子必须是OBJ1
(假设所有其他成员都是私有的)、operator()
(或执行调度并使其私有的命名函数)的朋友,然后从该中间调度器与OBJ2
成为朋友。
- 通过方法访问结构
- 使用不带参数的函数访问结构元素
- 如果我只是不访问queue_front节点的子节点,而是将它们推到队列中呢?还是BFS吗
- 用于访问容器<T>数据成员的正确 API
- 访问者访问变体并返回不同类型时出错
- 尝试通过多个向量访问变量时,向量下标超出范围
- 无法访问嵌套类.类的使用无效
- 写入位置0x0000000C时发生访问冲突
- 我们可以访问一个不存在的联盟的成员吗
- C++从另一个类访问公共静态向量的正确方法是什么
- 我的简单if-else语句是如何无法访问的代码
- 使用 CTRP 时,是否访问访问父构造函数 UB 中的子属性?
- Lambda 函数,用于调用有权访问类成员的成员函数
- 使用QtCreator,如何在我有权访问ssh的远程服务器上构建我的项目?
- 默认赋值运算符有权访问基类的私有成员
- 访问接口的私有继承如何允许可访问对象访问访问私有访问实现
- 外部必须有权访问类构造函数
- 检查用户名是否有权访问窗口上的文件夹
- 获取从基类指针到具有不同类型的两个派生成员变量的访问权
- 好友有权访问好友的成员,但似乎无法更新好友的成员