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?

StackOverflow https://stackoverflow.com/questions/851041

Pergunta

Eu tenho três classes:

  1. A classe detentor de dados CDataHolder, que usa um padrão Pimpl

    class CDataHolder
    {
    public:
      // ...
    private:
    friend class CBase;
    struct PImpl;
    PImpl* iPimpl;
    };
    
  2. 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();
    };
    
  3. 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.

Foi útil?

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ê.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top