2009-05-12 18 views
2

私は三つのクラスがありますPIMPLパターンデータクラスのプライベートメンバー変数に、親クラスがデータクラスのフレンドクラスである別の派生クラスからアクセスするにはどうすればよいですか?

 
class CDataHolder 
{ 
public: 
    // ... 
private: 
friend class CBase; 
struct PImpl; 
PImpl* iPimpl; 
}; 
  • CDataHolderにiPImpl部材にアクセスする必要がある基本クラスにCBaseを使用

    1. データホルダークラスCDataHolderを、それSAMにアクセスする必要がCDataHolder

       
      class CBase: 
      { 
      protected: 
      CDataHolder::Pimpl* getDataHolderPimpl(); 
      }; 
      
    2. にCBaseからCDerived派生クラスのフレンドクラスですe iPimplメンバー。ここで問題が発生します。 派生クラスは、親クラスがフレンドクラスであるにもかかわらず、iPimplメンバーを使用できません。このように:それはCDataHolderクラスで「友人クラスCDerivedXXX」行を置くために、各派生クラスのための良い方法ではないので、

       
      class CDerived : public CBase 
      { 
      public: 
      void doSth() { 
          CDataHolder::Pimpl *pImpl = getDataHolderPimpl(); // this line raises an error: 
                      // "illegal access from CDataHolder to protected/private member CDataHolder::PImpl" 
      } 
      }; 
      

      派生クラスがたくさんあります。 この問題を解決するにはどうすればよいですか?これを行うより良い方法はありますか?前もって感謝します。あなたはCDataHolderクラスのプライベートな部分でstruct PImplを宣言しておりますので

  • 答えて

    2

    、CDataHolderの唯一の友人が同じにアクセスすることができます。パブリックセクションに前方宣言struct PImplを置いたり、CDataHolderクラスの前にさらに改善したりするのはなぜですか?

    +0

    ありがとうございました。 "struct Pimpl"宣言を公開した後で動作します。私は上記のエラー情報を誤解しています。つまり、CDataHolder :: Pimpl型にアクセスできません。タイプにはパブリックアクセスが必要です。どうもありがとうございました。 – douyw

    1

    友人は(正当な)非常に限られており、継承することはできません。質問をするのは嫌いですが、A)PImplへの一般的なアクセス、またはその一部を必要とするか、B)PImplで何かを行うためにDataHolderクラスが必要です。