如何授予对私有方法的访问权限

How to grant access to a private method

本文关键字:访问 访问权 权限 有方法 何授予      更新时间:2023-10-16

可能重复:
什么是访问说明符?我应该与私人继承、受保护继承还是公开继承?

我正在寻找一些代码或设计模式,以授予对另一个类(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,它提供了一种通过封闭类OBJ2my_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成为朋友。