2

私は3つのクラスを持っています:

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

    クラス CDataHolder
    {
    公衆:
      // ...
    プライベート:
    フレンド クラス CBase;
    構造体 PImpl;
    PImpl* iPimpl;
    };
    
  2. CDataHolder の iPImpl メンバーにアクセスする必要がある基本クラス CBase で、CDataHolder のフレンド クラスです。

    クラス CBase:
    {
    保護:
    CDataHolder::Pimpl* getDataHolderPimpl();
    };
    
  3. 同じ iPimpl メンバーにもアクセスする必要がある、CBase から派生した派生クラス CD。ここで問題が発生します。派生クラスは、親クラスがフレンド クラスですが、iPimpl メンバーを使用できません。このような:

    クラス CDerived : public CBase
    {
    公衆:
    ボイドdoSth() {
       CDataHolder::Pimpl *pImpl = getDataHolderPimpl(); // この行でエラーが発生します:
                                                         // 「CDataHolder からプロテクト/プライベート メンバー CDataHolder::PImpl への不正アクセス」
    }
    };
    

    派生クラスはたくさんあるので、派生クラスごとに「friend class CDerivedXXX」という行を CDataHolder クラスに入れるのは得策ではありません。この問題を克服するにはどうすればよいですか?これを行うより良い方法はありますか?前もって感謝します。

4

2 に答える 2

2

CDataHolder クラスの private 部分で宣言struct PImplしているため、CDataHolder のフレンドのみがアクセスできます。struct PImplpublic セクションまたは CDataHolder クラスの前に前方宣言を入れてみませんか?

于 2009-05-12T03:45:42.720 に答える
1

フレンドは (当然のことながら) 非常に限られており、継承することはできません。質問をするのは嫌いですが、おそらく A) PImpl またはその一部へのパブリック アクセスが必要か、または B) PImpl で何かを行うために DataHolder クラスが必要です。

于 2009-05-12T03:52:32.803 に答える