2012-01-06 53 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