Как получить доступ к закрытой переменной-члену класса данных из другого производного класса, родительский класс которого является дружественным классом класса д
-
21-08-2019 - |
Вопрос
У меня три занятия:
Класс владельца данных CDataHolder, который использует шаблон Pimpl
class CDataHolder { public: // ... private: friend class CBase; struct PImpl; PImpl* iPimpl; };
Базовый класс CBase, которому необходим доступ к элементу iPImpl в CDataHolder, поэтому это дружественный класс CDataHolder
class CBase: { protected: CDataHolder::Pimpl* getDataHolderPimpl(); };
Производный класс, полученный из 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 за вас.