Vedo un sacco di codice sorgente che usa il linguaggio PImpl in C ++. Presumo che il suo scopo sia quello di nascondere i dati / tipo / implementazione privati, in modo che possa rimuovere la dipendenza e quindi ridurre il tempo di compilazione e l'intestazione includa il problema.
Ma anche le classi interface / pure-abstract in C ++ hanno questa capacità, possono anche essere usate per nascondere dati / tipo / implementazione. E per consentire al chiamante di vedere semplicemente l'interfaccia durante la creazione di un oggetto, possiamo dichiarare un metodo factory nell'intestazione dell'interfaccia.
Il confronto è:
Costo :
Il costo dell'interfaccia è inferiore, poiché non è nemmeno necessario ripetere l'implementazione della funzione wrapper pubblica
void Bar::doWork() { return m_impl->doWork(); }
, è sufficiente definire la firma nell'interfaccia.Ben capito :
La tecnologia dell'interfaccia è meglio compresa da ogni sviluppatore C ++.
Prestazioni :
Interfaccia modo prestazioni non peggiori del linguaggio PImpl, sia un ulteriore accesso alla memoria. Presumo che la performance sia la stessa.
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 utilizzando 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();
Allora, qual è il punto di PImpl?
Impl
classe non interromperàABI
, ma l'aggiunta di una funzione pubblica nell'interfaccia si interromperàABI
.