Ich sehe eine Menge Quellcode, der PImpl-Idiom in C ++ verwendet. Ich gehe davon aus, dass der Zweck darin besteht, die privaten Daten / den Typ / die Implementierung zu verbergen, damit die Abhängigkeit beseitigt und die Kompilierungszeit und das Problem mit dem Header-Einschluss verringert werden können.
Interface- / pure-abstract-Klassen in C ++ verfügen jedoch auch über diese Funktion. Sie können auch zum Ausblenden von Daten / Typ / Implementierung verwendet werden. Damit der Aufrufer beim Erstellen eines Objekts nur die Schnittstelle sieht, können wir im Header der Schnittstelle eine Factory-Methode deklarieren.
Der Vergleich ist:
Kosten :
Die Kosten für den Schnittstellenweg sind geringer, da Sie die Implementierung der Public-Wrapper-Funktion nicht einmal wiederholen
void Bar::doWork() { return m_impl->doWork(); }
müssen. Sie müssen lediglich die Signatur in der Schnittstelle definieren.Gut verstanden :
Die Schnittstellentechnologie wird von jedem C ++ - Entwickler besser verstanden.
Leistung :
Interface Way Performance nicht schlechter als PImpl Idiom, sowohl ein zusätzlicher Speicherzugriff. Ich gehe davon aus, dass die Leistung gleich ist.
Das Folgende ist der Pseudocode, um meine Frage zu veranschaulichen:
// 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;
};
Der gleiche Zweck kann über die Schnittstelle implementiert werden:
// 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();
Was ist der Sinn von PImpl?
Impl
Klasse unterbricht nicht die FunktionABI
, das Hinzufügen einer öffentlichen Funktion in der Schnittstelle wird jedoch unterbrochenABI
.