У меня есть три класса:Как получить доступ к переменной частного члена класса данных из другого производного класса, родительский класс которого является классом друзей класса данных?
Держатель данных класса CDataHolder, который использует шаблон Pimpl
class CDataHolder { public: // ... private: friend class CBase; struct PImpl; PImpl* iPimpl; };
Базовый класс CBase, которые должны получить доступ к элементу iPImpl в CDataHolder, так это является другим классом CDataHolder
class CBase: { protected: CDataHolder::Pimpl* getDataHolderPimpl(); };
Производного класса CDerived из CBase, которые должны получить доступ к Сэму e 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. Как преодолеть эту проблему? Есть лучший способ сделать это? Заранее спасибо.
Спасибо и ваш быстрый ответ. Он работает после публикации объявления «struct Pimpl» для общественности. Я неправильно понял данные об ошибках, приведенные выше, что означает, что он не может получить доступ к типу CDataHolder :: Pimpl. Тип нужен публичный доступ. Большое спасибо. – douyw