0Pricing
C++ Academy · Lección

Ocultación de la implementación con PIMPL

Oculte los detalles de implementación tras el idiom pointer-to-implementation.

Ocultación de la implementación con PIMPL es una lección gratuita de C++ Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de C++ Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de C++ Academy incluye 4 lecciones en total.

El idiom PIMPL

PIMPL = «Pointer to IMPLementation». Traslade los datos privados de la clase a una estructura impl independiente, a la que se accede mediante un puntero.

¿Por qué PIMPL?

Ventajas:

  • Oculta los detalles de implementación en las cabeceras
  • Reduce las dependencias durante la compilación
  • Mantiene la estabilidad de la ABI al añadir miembros privados
  • Permite intercambiar implementaciones

Estructura básica

La clase pública contiene un puntero a una estructura Impl definida únicamente en el archivo .cpp.

// widget.h
class Widget {
public:
    Widget();
    ~Widget();
    void doSomething();
private:
    struct Impl;
    std::unique_ptr<Impl> pimpl_;
};

Impl en el archivo .cpp

La estructura Impl contiene todos los datos reales.

// widget.cpp
struct Widget::Impl {
    std::string name;
    int counter;
    // ... anything else, freely
};

Widget::Widget()
    : pimpl_(std::make_unique<Impl>()) {}

Widget::~Widget() = default;  // must be in .cpp where Impl is complete

void Widget::doSomething() {
    pimpl_->counter++;
}

Destructor en el archivo cpp

El destructor debe definirse en el archivo .cpp donde Impl esté completo. De lo contrario, unique_ptr no puede eliminar un tipo incompleto.

Funciones miembro especiales

Las operaciones de copia, movimiento y asignación también deben declararse explícitamente si son necesarias. Las versiones generadas por el compilador no pueden trabajar con un tipo incompleto en la cabecera.

// widget.h
class Widget {
public:
    Widget(const Widget& other);
    Widget& operator=(const Widget& other);
    Widget(Widget&&) noexcept;
    Widget& operator=(Widget&&) noexcept;
    ~Widget();
};

Coste de rendimiento

PIMPL añade una indirección en cada acceso a un miembro y una reserva en el heap. En métodos que se llaman con frecuencia, esto puede ser relevante: mídalo para asegurarse.

Compilaciones más rápidas

Las cabeceras que antes incluían tipos de la biblioteca estándar o dependencias costosas ahora pueden ser más ligeras. Modifique el archivo .cpp sin recompilar a los consumidores.

PIMPL con herencia

Se puede combinar con la herencia, pero añade complejidad. Normalmente, la clase pública no hereda de nada; Impl puede utilizar la herencia libremente.

Variantes

Alternativas y mejoras:

  • Fast PIMPL: almacenamiento inline con placement new
  • Dirección estable: Impl permanece asignado durante toda la vida del objeto
  • Borrado de tipos: Impl puede ser polimórfico

Uso en el mundo real

PIMPL se utiliza ampliamente en:

  • Qt (cada widget utiliza PIMPL)
  • Muchas bibliotecas propietarias
  • Boost (en algunos casos)

Cuándo usarlo

Use PIMPL cuando:

  • Quiera estabilidad de la ABI entre versiones
  • Sus cabeceras incluyan demasiadas dependencias de forma transitiva
  • Exponga una API pública de biblioteca

Cuándo evitarlo

Evite PIMPL cuando:

  • La clase sea interna y ningún consumidor dependa de la cabecera
  • La sobrecarga de rendimiento sea más importante que los tiempos de compilación
  • La clase sea pequeña o se modifique rara vez

Comprobación rápida

¿Por qué debe definirse el destructor de una clase PIMPL en el archivo .cpp?

Resumen

PIMPL oculta la implementación trasladando los datos privados a una estructura Impl a la que se accede mediante unique_ptr. Mejora la estabilidad de la ABI y los tiempos de compilación, a costa de añadir una indirección. Defina las funciones miembro especiales en el archivo .cpp, donde Impl esté completo.

Preguntas frecuentes

¿La lección «Ocultación de la implementación con PIMPL» es gratis?

Sí — el texto completo de «Ocultación de la implementación con PIMPL» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de C++ Academy, actualiza a CoddyKit PRO. El curso de C++ Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Ocultación de la implementación con PIMPL»?

Oculte los detalles de implementación tras el idiom pointer-to-implementation. Practicas C++ Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar C++ Academy?

No se requiere experiencia previa. C++ Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.

¿Cuánto tiempo toma la lección «Ocultación de la implementación con PIMPL»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de C++ Academy?

Sí. Cada lección de C++ Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Bibliotecas solo de cabecera frente a compiladas
  2. Versionado de API y estabilidad de ABI
  3. Ocultación de la implementación con PIMPL
  4. Escritura de una biblioteca de utilidades moderna solo de cabecera
← Volver a C++ Academy