Cómo acceder a la variable miembro privada de una clase de datos de otra clase derivada cuya clase padre es una clase de amigo de la clase de datos?

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

Pregunta

Tengo tres clases:

  1. A CDataHolder clase titular de los datos, que utiliza un patrón Pimpl

    class CDataHolder
    {
    public:
      // ...
    private:
    friend class CBase;
    struct PImpl;
    PImpl* iPimpl;
    };
    
  2. Una clase base CBase, lo que necesita para acceder al miembro de iPImpl en CDataHolder, por lo que es una clase de amigo CDataHolder

    class CBase: 
    {
    protected:
    CDataHolder::Pimpl* getDataHolderPimpl();
    };
    
  3. Una clase derivada CDerived de CBase, que necesita acceder a los mismo miembro iPimpl también. Aquí se produce un problema. La clase derivada no puede usar el miembro iPimpl aunque su clase padre es una clase de amigo. de esta manera:

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

    Hay un montón de clases derivadas, por lo que no es una buena manera para cada clase derivada de poner una línea de "clase CDerivedXXX amigo" en la clase CDataHolder. ¿Cómo superar este problema? ¿Hay una mejor manera de hacer esto? Gracias de antemano.

¿Fue útil?

Solución

Puesto que usted ha declarado struct PImpl en la parte privada de la clase CDataHolder, sólo los amigos de CDataHolder pueden acceder a la misma. ¿Por qué no pones una declaración adelantada <=> en la sección pública o incluso mejor antes de la clase CDataHolder?

Otros consejos

amigo es (con razón) muy limitado y no se puede heredar. No me gusta una petición de principio, pero tal vez sea A) que necesita el acceso público a PImpl o algún aspecto de ella, o B) que necesita la clase DataHolder hacer algo con PImpl para usted.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top