Come accedere variabile membro privato di una classe di dati da un altro classe derivata la cui classe genitore è una classe amico della classe di dati?

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

Domanda

Ho tre classi:

  1. Una classe CDataHolder titolare, che utilizza un modello Pimpl

    class CDataHolder
    {
    public:
      // ...
    private:
    friend class CBase;
    struct PImpl;
    PImpl* iPimpl;
    };
    
  2. Una classe di base CBase, che hanno bisogno di accedere al membro iPImpl in CDataHolder, quindi è un amico classe di CDataHolder

    class CBase: 
    {
    protected:
    CDataHolder::Pimpl* getDataHolderPimpl();
    };
    
  3. Una classe derivata da CDerived CBase, che hanno bisogno di accedere allo stesso membro iPimpl anche. Qui si verifica un problema. La classe derivata non può utilizzare il membro iPimpl anche se la sua classe genitore è una classe amico. in questo modo:

    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"
    }
    };
    

    Ci sono un sacco di classi derivate, quindi non è un buon modo per ogni classe derivata di mettere una linea di "amico di classe CDerivedXXX" in classe CDataHolder. Come superare questo problema? C'è un modo migliore per fare questo? Grazie in anticipo.

È stato utile?

Soluzione

Dal momento che avete dichiarato struct PImpl nella parte privata della classe CDataHolder, solo gli amici di CDataHolder possono accedere alla stessa. Perché non mettere una dichiarazione anticipata <=> nella sezione pubblica o meglio ancora prima della classe CDataHolder?

Altri suggerimenti

L'amico è (giustamente) molto limitata e non può essere ereditata. Odio a mendicare la questione, ma forse neanche A) è necessario l'accesso del pubblico ai Pimpl o qualche aspetto di essa, o B) si serve della classe DataHolder di fare qualcosa con Pimpl per te.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top