es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo definir una función miembro privada solo en cpp

Consideremos que tengo una clase con una variable miembro privada y una función privada que no quiero definir en el archivo de encabezado, porque quiero “ocultarla” del usuario.

¿Cómo puedo hacer esto? No puedo acceder a la variable privada sin la declaración de la función en el archivo de encabezado.

Así que lo que funciona es algo como esto:

// archivo de encabezado
class Testclass {
public:
// …
private:
const int m_i;
void func() const;
}

// archivo cpp
#include “TestClass.h”

Testclass::func() const {
int j = m_i; // acceso a una variable miembro privada
}

// …

Pero quiero algo como esto:

// archivo de encabezado
class Testclass{
public:
//…
private:
const int m_i;
}

// archivo cpp
#include “TestClass.h”

Testclass::func() const {
int j = m_i; // acceso a una variable miembro privada
}

// …

¿Qué posibilidades tengo? Leí algo sobre el patrón PIMPL, pero no estoy seguro de si es lo que quiero, ya que parece un poco incómodo en cuanto a programación.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Se puede utilizar el patrón de diseño Pimpl para lograr esto. El patrón de diseño Pimpl es una forma de ocultar los detalles de implementación de una clase al usuario. Consiste en crear un puntero a una estructura de datos opaca en el archivo de encabezado, y luego definir la implementación de la clase en el archivo cpp. De esta manera, el usuario solo ve el puntero en el archivo de encabezado, y los detalles de implementación se ocultan de él.

    Por ejemplo, se puede hacer algo así:

    // archivo de encabezado
    class ClaseDePrueba {
    public:
    // …
    private:
    struct Impl;
    Impl *m_impl;
    }

    // archivo cpp
    #include “ClaseDePrueba.h”

    struct ClaseDePrueba::Impl {
    const int m_i;
    };

    ClaseDePrueba::func() const {
    int j = m_impl->m_i; //acceso a una variable miembro privada
    }

    // …

    De esta manera, el usuario solo ve el puntero a la estructura de datos opaca en el archivo de encabezado, y los detalles de implementación se ocultan de él.

Comments are closed.