3

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

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

4

5 回答 5

2

访问method2是可能的,因为它是公开的。my_obj无法直接访问该成员,因为它是private. 要授予其他类对其的访问权限,请将它们声明friendOBJ2.

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

现在,X可以访问OBJ2::my_obj.

于 2012-10-02T13:11:37.130 回答
1

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

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

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

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

于 2012-10-02T13:12:46.957 回答
1

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

于 2012-10-02T13:13:39.093 回答
0

您需要的是一种调用成员的public方法。OBJ2method2my_obj

在这种情况下friend, ship 不会帮助您,因为它会授予对所有my_obj.

于 2012-10-02T13:15:07.473 回答
0

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

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

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

于 2012-10-02T13:31:47.197 回答