【问题标题】:How to grant access to a private method [duplicate]如何授予对私有方法的访问权限[重复]
【发布时间】:2012-09-23 08:11:26
【问题描述】:

可能重复:
What are access specifiers? Should I inherit with private, protected or public?

我正在寻找一些代码或设计模式来授予对另一个类 (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()(仅限此方法)?

【问题讨论】:

  • 你不能在 OBJ1 声明中声明 OBJ2::method3 为朋友吗?
  • @CoffeeonMars 有什么意义? OBJ1 只有公共成员。
  • 是的,抱歉,我看错了访问修饰符。

标签: c++ object private


【解决方案1】:

访问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

【讨论】:

  • 但这会打开my_obj 上的所有操作,而不仅仅是method2
  • @DanielEarwicker my_obj 上的所有操作都已经开放......它们都是公开的。
  • @LuchianGrigore my_obj 是OBJ2 的私有属性,所以friend 并不能解决我这里的问题。我想知道是否有办法访问OBJ2::my_obj.method2()(不是OBJ1::method2()。 :)
  • @Patouf 确实如此。 X 现在可以访问OBJ2::my_obj。再读一遍我的答案。
  • 他的评论“(仅限此方法)”暗示他不希望从 X 无限制地访问 my_obj。他只希望能够从课堂外调用 method2
【解决方案2】:

您已经回答了自己的问题:查看method3,它提供了一种通过封闭类OBJ2my_obj 上调用method1 的方法。可以添加类似的转发方法以允许访问method2

【讨论】:

  • 我试试这个,应该可以的。你是对的,我实际上回答了我自己的问题......谢谢!
【解决方案3】:

可能最好的方法是为此特定功能提供公共直通功能,就像您为 method3 所做的那样:

class OBJ2 
{   
     public:
         void method3()     
         {
             my_obj.method1();
         }
         void method2()
         {
             my_obj.method2();
         }
     private:
         OBJ1 my_obj; 
} 

这会稍微改变语法 - 您是针对 OBJ2 实例而不是直接针对包含的 OBJ1 实例调用该方法,但效果将是您所要求的。

这里的另一个考虑因素是这种类型的惯用语(公共包装函数)提供对包含成员的单个函数的无限外部访问。另一种方法(朋友声明)使单个外部类可以访问整个私有内部。如果您想要授予单个外部类对单个成员的访问权限,则最好使用代理对象或类似的东西组合这些方法。

【讨论】:

  • +1 这正是我的想法,但你先说了。
【解决方案4】:

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

在这种情况下,friendship 不会帮助您,因为它会授予对所有 my_obj 的访问权限。

【讨论】:

    【解决方案5】:

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

    如果该成员真的与其余成员不同并且访问它的对象不应访问该对象的其余部分,则一些替代方案将包括定义一个接口(多态)并在OBJ1中实现该接口。然后,您可以提交对该接口的引用,该接口没有其他可用成员。

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

    【讨论】:

      猜你喜欢
      • 2012-06-08
      • 2013-10-16
      • 2016-02-14
      • 1970-01-01
      • 2012-11-07
      • 2018-11-13
      • 1970-01-01
      • 1970-01-01
      • 2018-06-10
      相关资源
      最近更新 更多