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

时间:2012-10-02 13:09:41

标签: c++ object private

  

可能重复:
  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()(仅限此方法)?

5 个答案:

答案 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,其中提供了一种通过附上课程method1my_obj上致电OBJ2的方法。可以添加类似的转发方法以允许访问method2

答案 3 :(得分:0)

您需要的是public OBJ2方法,该method2方法会在my_obj成员上调用friend

在这种情况下,my_obj发货将无法帮助您,因为它会授予对{{1}}所有内容的访问权。

答案 4 :(得分:0)

从设计的角度来看,该语言不提供控制每个成员访问的工具,虽然你可以破解它只会使代码更复杂,更难维护和管理编译器(更复杂的代码意味着更难以优化代码)。

如果该成员与其他成员真正不同,并且访问它的对象不能访问该对象的其余部分将包括定义接口(多态)并在{{1}中实现该接口}。然后,您可以提交对没有其他成员可用的接口的引用。

从技术角度来看,可以做很多事情,例如,您可以创建一个访问器函数对象,该对象将OBJ1作为参数并调用该方法。仿函数必须是OBJ1的朋友(假设所有其他成员都是私有的),OBJ1(或执行调度的命名函数,并将其设为私有),然后成为{{1}的朋友来自那个中间调度员。