Как получить доступ к закрытой переменной-члену класса данных из другого производного класса, родительский класс которого является дружественным классом класса д

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. Производный класс, полученный из 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.Как преодолеть эту проблему?Есть ли лучший способ сделать это?Заранее спасибо.

Это было полезно?

Решение

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

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top