2012-01-06 11 views
0

私は別のクラスのプライベートメンバーにアクセスする必要のある2つのプライベートネストされたクラスを持っています。私はプライベートメンバーにアクセスする必要があるクラスをアクセスクラスの友人として配置することを考えましたが、A :: m_nDataはプライベートでアクセスできないというエラーが発生しています。とにかくD :: DoSomething()内のA :: m_nDataプライベートメンバーにアクセスする必要があることをコンパイラーに伝える? A.cpp ああプライベートネストされたクラス内のフレンド

class A 
{ 
    class D; 

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

    private: 
     friend class D; 

     int m_nData; 
}; 

ファイル

ファイル:

#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

+0

@ildjarn:実際のユースケースでは、Aは設定可能な4つのデリゲートを定義しています。 BはAのマネージャーのように振舞っています。私はたくさんのコードを削除しなければなりませんでしたが、CとDはAポインターを使ってAのコールバックを呼び出すラッパーです。私がそこに置いた例では、それらをint値に変更しました。 – thewalrusnp

+0

なぜ彼らは_nested_クラスでなければならないのか答えません...なぜ彼らは 'B'の中にネストされていますか? – ildjarn

答えて

1

ここに2つの友情が必要です。 にプライベートB::Dを知らせ、もう1つはB::DにプライベートデータにAでアクセスさせるようにします。

宣言(インクルード)クラスB class B

そして、クラスAに宣言する前に、追加します。

friend class A; 

これは、クラスAはプライベートB::Dについて知ることができます。 class Aで次に

、交換してください:

friend class D; 

をして:

friend class B::D; 
+1

@KerrekSB: '友達クラスB :: D'は' B :: D'へのアクセスを提供しません。今朝私のコーヒーが私に恋をしていない限り。 –

+1

@DrewDormann:いいえ、コーヒーの失敗は私の側です!コメントは削除されました! –

+0

@DrewDormann:B.hには既にA.hが含まれているので、再帰的な包含を得るので、A.hにはBクラスを含めることはできません。 – thewalrusnp

関連する問題