私は三つのクラスがありますPIMPLパターンデータクラスのプライベートメンバー変数に、親クラスがデータクラスのフレンドクラスである別の派生クラスからアクセスするにはどうすればよいですか?
class CDataHolder { public: // ... private: friend class CBase; struct PImpl; PImpl* iPimpl; };
CDataHolderにiPImpl部材にアクセスする必要がある基本クラスにCBaseを使用
データホルダークラスCDataHolderを、それSAMにアクセスする必要がCDataHolder
class CBase: { protected: CDataHolder::Pimpl* getDataHolderPimpl(); };
に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
を宣言しておりますので
ありがとうございました。 "struct Pimpl"宣言を公開した後で動作します。私は上記のエラー情報を誤解しています。つまり、CDataHolder :: Pimpl型にアクセスできません。タイプにはパブリックアクセスが必要です。どうもありがとうございました。 – douyw