2012-10-02 82 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