2012-01-06 86 views
0

我有兩個私人嵌套類需要訪問另一個類中的私人成員。我想將需要訪問私有成員的類放在被訪問的類中作爲朋友,但是我收到A :: m_nData是私有的錯誤,因此我無法訪問它。無論如何告訴編譯器,我需要訪問D :: DoSomething()中的A :: m_nData私有成員?私人嵌套類中的朋友

這裏是我想要做的一個樣本:

文件

class A 
{ 
    class D; 

    public: 
     A(); 
     ~A() {} 

    private: 
     friend class D; 

     int m_nData; 
}; 

文件A.cpp:

#include "A.h" 
#include "B.h" 

A::A() 
: m_nData(0) 
{ 
} 

文件了Bh:

#include "A.h" 

class B 
{ 
    public: 
     B() {} 
     ~B() {} 

    private: 
     class C 
     { 
      public: 
       C(A* pA): m_pA(pA) {} 
       virtual ~C() {} 
       virtual void DoSomething() {} 

      protected: 
       A* m_pA; 
     }; 

     class D: public C 
     { 
      public: 
       D(A* pA): C(pA) {} 
       virtual ~D() {} 
       virtual void DoSomething() 
       { 
        m_pA->m_nData++; 
       }; 
     }; 
}; 
+0

爲什麼必須'C'和'D'嵌套在'B'?你認爲這樣做有什麼好處? – ildjarn 2012-01-06 15:33:23

+0

@ildjarn:在實際使用情況下,A定義了4個可以設置的代表。 B充當A的管理者。我必須刪除大量代碼,但C和D是使用A指針調用A的回調的包裝器。在我放在那裏的例子中,我將它們改爲了一個int值。 – thewalrusnp 2012-01-06 15:40:54

+0

這並沒有回答他們爲什麼必須是_nested_ classes ...爲什麼他們嵌套在'B'裏面? – ildjarn 2012-01-06 15:41:44

回答

1

在這裏你需要兩個友誼。一個讓A知道私人B::D,另一個讓B::D訪問A中的私人數據。在class B聲明類A.

然後前

申報(包括)B類,添加:

friend class A; 

這使得A類瞭解的私人B::D

然後在class A,替換:

friend class D; 

有:

friend class B::D; 
+1

@KerrekSB:'朋友類B :: D'不提供對'B :: D'的訪問,它允許訪問它。除非我的咖啡今天早上沒有讓我失望。 – 2012-01-06 15:38:58

+1

@DrewDormann:不,咖啡失敗在我身邊!評論已刪除! – 2012-01-06 15:39:56

+0

@DrewDormann:我不能在A.h中包含B類,因爲我會得到遞歸包含,因爲B.h已經包含A.h. – thewalrusnp 2012-01-06 16:04:26