どのようにアクセスデータのクラスのプライベートメンバー変数から導出クラスの親クラスの友達のクラスのデータ。

StackOverflow https://stackoverflow.com/questions/851041

質問

いつクラス

  1. データホルダークラスCDataHolderを使用するPimplパターン

    class CDataHolder
    {
    public:
      // ...
    private:
    friend class CBase;
    struct PImpl;
    PImpl* iPimpl;
    };
    
  2. 基底クラスCBase、アクセスする必要iPImpl員CDataHolderいそうですね、本当に神経質になクラスのCDataHolder

    class CBase: 
    {
    protected:
    CDataHolder::Pimpl* getDataHolderPimpl();
    };
    
  3. 導出クラスCDerivedからCBase、必要なアクセスしてくださいiPimpl員もございますここが問題である。の派生クラスを使用できないiPimpl会員がその親クラスは友人のクラスです。このように:

    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"
    }
    };
    

    たくさんあり、導出クラスでない方のための各派生クラスに入る"友達のクラスCDerivedXXX線のCDataHolderクラスです。どのようこの問題を克服するための?あると良い。よろしくお願いします。

役に立ちましたか?

解決

あなたはCDataHolderクラスのプライベートな部分でstruct PImplを宣言しておりますので、

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

他のヒント

フレンドは(当然)非常に限られており、継承することはできません。私は質問を頼むことを憎むが、多分どちらかA)あなたは公衆PIMPLへのアクセスまたはその一部側面、またはBを必要とする)あなたはあなたのためにPIMPLで何かをするDataHolderクラスを必要とします。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top