Как получить доступ к закрытой переменной-члену класса данных из другого производного класса, родительский класс которого является классом-другом класса данных? - PullRequest
2 голосов
/ 12 мая 2009

У меня есть три класса:

  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. Производный класс CD, полученный из 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"
    }
    };
    

    Существует множество производных классов, поэтому для каждого производного класса плохой способ поместить строку "Friend Class CDerivedXXX" в класс CDataHolder. Как преодолеть эту проблему? Есть лучший способ сделать это? Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 12 мая 2009

Поскольку вы объявили struct PImpl в закрытой части класса CDataHolder, доступ к нему могут получить только друзья CDataHolder. Почему бы вам не поместить предварительную декларацию struct PImpl в публичный раздел или даже лучше перед классом CDataHolder?

1 голос
/ 12 мая 2009

Друг (по праву) очень ограничен и не может быть унаследован. Я не хочу задавать этот вопрос, но, может быть, либо А) вам нужен открытый доступ к PImpl или некоторому его аспекту, либо Б) вам нужен класс DataHolder, чтобы сделать что-то для вас с PImpl.

...