Como acessar variável de membro particular de uma classe de dados a partir de outra classe derivada cuja classe pai é uma classe amigo da classe de dados?
-
21-08-2019 - |
Pergunta
Eu tenho três classes:
-
A classe detentor de dados CDataHolder, que usa um padrão Pimpl
class CDataHolder { public: // ... private: friend class CBase; struct PImpl; PImpl* iPimpl; };
-
A classe base CBase, que precisam acessar o membro iPImpl em CDataHolder, por isso é um amigo classe de CDataHolder
class CBase: { protected: CDataHolder::Pimpl* getDataHolderPimpl(); };
-
A classe derivada CDerived de CBase, que precisam acessar o mesmo membro iPimpl também. Aqui ocorre um problema. A classe derivada não pode usar o membro iPimpl embora sua classe pai é uma classe amigo. assim:
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" } };
Há uma abundância de classes derivadas, por isso não é uma boa maneira para cada classe derivada de colocar uma linha de "amigo classe CDerivedXXX" na classe CDataHolder. Como superar esse problema? Existe uma maneira melhor de fazer isso? Agradecemos antecipadamente.
Solução
Uma vez que você tenha declarado struct PImpl
na parte privada da classe CDataHolder, apenas amigos de CDataHolder pode acessar o mesmo. Por que você não colocar um struct PImpl
declaração para a frente na seção pública ou, melhor ainda antes da aula CDataHolder?
Outras dicas
amigo é (justamente) muito limitado e não pode ser herdada. Eu odeio a pedir a pergunta, mas talvez seja um) você precisa acesso do público aos Pimpl ou algum aspecto dela, ou B) você precisa a classe DataHolder fazer algo com Pimpl para você.