2012-10-02 38 views
2

可能重复访问:
What are access specifiers? Should I inherit with private, protected or public?如何授予给私有方法

我要寻找一些代码或设计模式,从另一个类授予访问私有方法(C++ )。

比方说,我有1类OBJ1:

class OBJ1 
{ 
    public: 
    void method1(); 
    void method2(); 
} 

而另一个类OBJ 2,其中实例OBJ1:

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

有没有一种方法来访问从其他类OBJ2::my_obj.method2()(仅此方法) ?

+0

你不能在OBJ1声明中声明OBJ2 :: method3的朋友吗? –

+1

@CoffeeonMars会有什么意义? OBJ1只有公众会员。 –

+0

是的,对不起,我误读了访问修饰符。 –

回答

1

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

+0

我会尝试这个,它应该工作。你说得对,我确实回答了我自己的问题......谢谢! – Patouf

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

+0

但是,这会打开'my_obj'上的所有操作,而不仅仅是'method2'。 –

+0

@DanielEarwicker对'my_obj'的所有操作已经打开......他们都是公开的。 –

+1

@LuchianGrigore'my_obj'是OBJ2的一个私有属性,所以'friend'在这里没有解决我的问题。我想知道是否有方法访问'OBJ2 :: my_obj.method2()'(不是'OBJ1 :: method2()')** **。 :) – Patouf

1

也许这样做会为此提供特定功能的公共直通功能的最好办法,像你为method3

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

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

这里的另一个考虑是这种类型的成语(公共包装函数)为您包含的成员的单个函数提供无限制的外部访问。另一种方法(朋友声明)为整个私人内部提供了一个外部类访问权限。如果你想要给单个成员授予一个外部类的访问权限,那么使用代理对象或类似的东西来组合这些方法可能会更好。

+0

+1这正是我的想法,但你先说。 – andre

0

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

在这种情况下,friend船不会帮助你,因为它会授予访问所有my_obj

0

从设计角度来看,该语言没有提供控制每个成员访问的设施,虽然你可以破解它只是让代码更复杂,更难以维护和管理编译器(更复杂的代码意味着难以优化代码)。和访问它不应访问该对象的其余部分

一些选择,如果该成员是真的到其他不同的对象将包括定义一个接口(多态),并实现该接口在OBJ1。然后,您可以提交没有其他成员可用的界面的引用。

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