C++
Pimpl-Idiom
Suche…
Bemerkungen
Das Pimpl-Idiom ( P ointer to Implementation , manchmal auch als undurchsichtiger Zeiger oder Cheshire-Cat-Verfahren bezeichnet ) reduziert die Kompilierungszeiten einer Klasse, indem alle privaten Datenelemente in eine in der CPP-Datei definierte Struktur verschoben werden.
Die Klasse besitzt einen Zeiger auf die Implementierung. Auf diese Weise kann es vorwärts erklärt werden, so dass die Header - Datei nicht benötigt #include
- Klassen , die in der privaten Membervariablen verwendet werden.
Bei Verwendung des Pimpl-Idioms müssen für das Ändern eines privaten Datenelements keine davon abhängigen Klassen neu kompiliert werden.
Grundlegendes Pimpl-Idiom
In der Headerdatei:
// widget.h
#include <memory> // std::unique_ptr
#include <experimental/propagate_const>
class Widget
{
public:
Widget();
~Widget();
void DoSomething();
private:
// the pImpl idiom is named after the typical variable name used
// ie, pImpl:
struct Impl; // forward declaration
std::experimental::propagate_const<std::unique_ptr< Impl >> pImpl; // ptr to actual implementation
};
In der Implementierungsdatei:
// widget.cpp
#include "widget.h"
#include "reallycomplextype.h" // no need to include this header inside widget.h
struct Widget::Impl
{
// the attributes needed from Widget go here
ReallyComplexType rct;
};
Widget::Widget() :
pImpl(std::make_unique<Impl>())
{}
Widget::~Widget() = default;
void Widget::DoSomething()
{
// do the stuff here with pImpl
}
Das pImpl
enthält den Widget
Status (oder einige / die meisten davon). Anstatt die Widget
in der Headerdatei verfügbar zu machen, kann sie nur innerhalb der Implementierung verfügbar gemacht werden.
pImpl
steht für "Zeiger auf Implementierung". Die "echte" Implementierung von Widget
befindet sich im pImpl
.
Gefahr: Beachten Sie, dass ~Widget()
an einer Stelle in einer Datei implementiert werden muss, an der das Impl
vollständig sichtbar ist, damit dies mit unique_ptr
Impl
. Sie können =default
es gibt, aber wenn =default
wo Impl
nicht definiert ist, wird das Programm leicht schlecht ausgebildet ist , keine Diagnose erforderlich.