可能重复:
What are access specifiers? Should I inherit with private, protected or public?
我正在寻找一些代码或设计模式来授予从另一个类(C ++)访问私有方法的权限。
假设我有一个类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()
(仅限此方法)?
答案 0 :(得分:1)
可以访问method2
,因为它是公开的。无法直接访问成员my_obj
,因为它是private
。要授予其他类访问权限,请在friend
中将其声明为OBJ2
。
class OBJ2
{
public:
void method3()
{
my_obj.method1();
}
private:
friend class X;
OBJ1 my_obj;
}
现在,X
可以访问OBJ2::my_obj
。
答案 1 :(得分:1)
执行此操作的最佳方法可能是为此特定功能提供公共直通功能,就像您对method3
所做的那样:
class OBJ2
{
public:
void method3()
{
my_obj.method1();
}
void method2()
{
my_obj.method2();
}
private:
OBJ1 my_obj;
}
这稍微改变了语法 - 您正在针对OBJ2实例而不是直接针对包含的OBJ1实例调用该方法,但效果将是您要求的。
这里的另一个考虑因素是这种类型的成语(公共包装函数)可以无限制地外部访问包含成员的单个函数。另一种方法(朋友声明)提供对整个私人内部的单个外部类访问。如果您想要的是授予单个成员的单个外部类访问权限,那么最好使用代理对象或类似的东西来组合这些方法。
答案 2 :(得分:1)
您已回答了自己的问题:请查看method3
,其中提供了一种通过附上课程method1
在my_obj
上致电OBJ2
的方法。可以添加类似的转发方法以允许访问method2
。
答案 3 :(得分:0)
您需要的是public
OBJ2
方法,该method2
方法会在my_obj
成员上调用friend
。
在这种情况下,my_obj
发货将无法帮助您,因为它会授予对{{1}}所有内容的访问权。
答案 4 :(得分:0)
从设计的角度来看,该语言不提供控制每个成员访问的工具,虽然你可以破解它只会使代码更复杂,更难维护和管理编译器(更复杂的代码意味着更难以优化代码)。
如果该成员与其他成员真正不同,并且访问它的对象不能访问该对象的其余部分将包括定义接口(多态)并在{{1}中实现该接口}。然后,您可以提交对没有其他成员可用的接口的引用。
从技术角度来看,可以做很多事情,例如,您可以创建一个访问器函数对象,该对象将OBJ1
作为参数并调用该方法。仿函数必须是OBJ1
的朋友(假设所有其他成员都是私有的),OBJ1
(或执行调度的命名函数,并将其设为私有),然后成为{{1}的朋友来自那个中间调度员。