Veo un montón de código fuente que usa la expresión de PImpl en C ++. Supongo que su propósito es ocultar los datos / tipo / implementación privados, 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 interface / pure-abstract en C ++ también tienen esta capacidad, también se pueden usar para ocultar datos / tipo / implementación. Y para permitir 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 más bajo, ya que ni siquiera necesita repetir la implementación de la función de contenedor público
void Bar::doWork() { return m_impl->doWork(); }
, solo necesita definir la firma en la interfaz.Bien entendido :
La tecnología de interfaz es mejor entendida por todos los desarrolladores de C ++.
Rendimiento :
El rendimiento de la interfaz no es peor que el idioma de PImpl, tanto un acceso a memoria adicional. Supongo que el rendimiento es el mismo.
El siguiente es 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 usando 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?
Impl
la clase no rompa elABI
, además de añadir la función pública en la interfaz se romperáABI
.