C++
Pimpl Idioom
Zoeken…
Opmerkingen
Het pimpl-idioom ( p ointer tot implementatie , ook wel ondoorzichtige pointer of cheshire cat-techniek genoemd ), vermindert de compilatietijden van een klasse door alle privégegevensleden te verplaatsen naar een struct die is gedefinieerd in het .cpp-bestand.
De klas bezit een pointer naar de implementatie. Op deze manier kan het op voorhand worden gedeclareerd, zodat het headerbestand geen #include
hoeft te bevatten die worden gebruikt in variabelen voor privéleden.
Wanneer u het pimpl-idioom gebruikt, hoeft u voor het wijzigen van een particulier gegevenslid geen klassen opnieuw te compileren die hiervan afhankelijk zijn.
Basic Pimpl-idioom
In het header-bestand:
// 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 het implementatiebestand:
// 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
}
De pImpl
bevat de Widget
status (of een deel ervan). In plaats van de Widget
van de status die in het headerbestand wordt weergegeven, kan deze alleen binnen de implementatie worden weergegeven.
pImpl
staat voor "pointer naar implementatie". De "echte" implementatie van Widget
staat in de pImpl
.
Gevaar: Merk op dat om dit te laten werken met unique_ptr
, ~Widget()
moet worden geïmplementeerd op een punt in een bestand waar de Impl
volledig zichtbaar is. U kunt het daar =default
, maar als =default
waar Impl
is gedefinieerd, kan het programma gemakkelijk Impl
worden, geen diagnose vereist.