Vedo un sacco di codice sorgente che usa l'idioma PImpl in C ++. Presumo che il suo scopo sia quello di nascondere i dati privati / tipo / implementazione, in modo che possa rimuovere la dipendenza e quindi ridurre il tempo di compilazione e il problema dell'intestazione.
Ma anche le classi di interfaccia / pure-abstract in C ++ hanno questa capacità, possono anche essere usate per nascondere dati / tipo / implementazione. E per consentire al chiamante di vedere l'interfaccia solo quando si crea un oggetto, possiamo dichiarare un metodo factory nell'intestazione dell'interfaccia.
Il confronto è:
-
Costo :
Il costo della modalità di interfaccia è inferiore, perché non è nemmeno necessario ripetere l'implementazione della funzione wrapper pubblico
void Bar::doWork() { return m_impl->doWork(); }
, è sufficiente definire la firma nell'interfaccia. -
Ben comprensibile :
La tecnologia dell'interfaccia è meglio compresa da ogni sviluppatore C ++.
-
Performance :
Le prestazioni dell'interfaccia non sono peggiori dell'idioma PImpl, sia un accesso extra alla memoria. Presumo che le prestazioni siano le stesse.
Di seguito è riportato lo pseudocodice per illustrare la mia domanda:
// 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;
};
Lo stesso scopo può essere implementato usando l'interfaccia:
// 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();
Quindi qual è il punto di PImpl?