Ich habe drei Klassen:Wie auf eine private Mitgliedsvariable einer Datenklasse von einer anderen abgeleiteten Klasse zugreifen, deren Elternklasse eine Freundklasse der Datenklasse ist?
Eine Klasse CDataHolder Datenbehälter, die ein Muster Pimpl verwendet
class CDataHolder { public: // ... private: friend class CBase; struct PImpl; PImpl* iPimpl; };
Eine Basisklasse CBase, die das iPImpl Mitglied in CDataHolder, so dass es zugreifen müssen ist ein Freund Klasse von CDataHolder
class CBase: { protected: CDataHolder::Pimpl* getDataHolderPimpl(); };
eine abgeleitete Klasse von CBase CDerived, die die sam zugreifen müssen e iPimpl-Mitglied auch. Hier tritt ein Problem auf. Die abgeleitete Klasse kann das iPimpl-Member nicht verwenden, obwohl die Elternklasse eine Friend-Klasse ist. wie folgt aus:
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" } };
Es gibt viele abgeleitete Klassen sind, ist es so für jede abgeleitete Klasse einen „Freund Klasse CDerivedXXX“ Zeile in CDataHolder Klasse setzen kein guter Weg. Wie überwinde ich dieses Problem? Gibt es einen besseren Weg, dies zu tun? Danke im Voraus.
Vielen Dank und Ihre schnelle Antwort. Es funktioniert, nachdem die "struct Pimpl" -Deklaration öffentlich gemacht wurde. Ich habe die oben angegebene Fehlerinformation falsch verstanden, das heißt, sie kann nicht auf den CDataHolder :: Pimpl-Typ zugreifen. Der Typ benötigt einen öffentlichen Zugriff. Vielen Dank. – douyw