Veo un montón de código fuente que utiliza el lenguaje PImpl en C ++. Supongo que su propósito es ocultar los datos privados / tipo / implementación, para que pueda eliminar la dependencia, y luego reducir el tiempo de compilación y el problema de inclusión del encabezado.
Pero las clases de interfaz / extracto puro en C ++ también tienen esta capacidad, también pueden usarse para ocultar datos / tipo / implementación. Y para que la persona que llama solo vea la interfaz al crear un objeto, podemos declarar un método de fábrica en el encabezado de la interfaz.
La comparación es:
-
Coste :
El costo de la interfaz es menor, ya que ni siquiera necesita repetir la implementación de la función de envoltura pública
void Bar::doWork() { return m_impl->doWork(); }
, solo necesita definir la firma en la interfaz. -
Bien entendido :
Todos los desarrolladores de C ++ comprenden mejor la tecnología de interfaz.
-
Rendimiento :
El rendimiento de la interfaz no es peor que el lenguaje PImpl, tanto un acceso de memoria adicional. Asumo que el rendimiento es el mismo.
A continuación se muestra el pseudocódigo para ilustrar mi pregunta:
// Forward declaration can help you avoid include BarImpl header, and those included in BarImpl header.
class BarImpl;
class Bar
{
public:
// public functions
void doWork();
private:
// You don't need to compile Bar.cpp after changing the implementation in BarImpl.cpp
BarImpl* m_impl;
};
El mismo propósito se puede implementar utilizando la interfaz:
// Bar.h
class IBar
{
public:
virtual ~IBar(){}
// public functions
virtual void doWork() = 0;
};
// to only expose the interface instead of class name to caller
IBar* createObject();
Entonces, ¿cuál es el punto de PImpl?