C++
Pimpl Idiom
Sök…
Anmärkningar
Pimpl-formspråket ( p ointer till implementering , ibland kallad opak pekare eller cheshire-kattteknik ), minskar sammanställningstiderna för en klass genom att flytta alla sina privata datamedlemmar till en struktur definierad i .cpp-filen.
Klassen äger en pekare till implementeringen. På så sätt kan det förklaras framåt, så att huvudfilen inte behöver #include
inkludera klasser som används i privata medlemsvariabler.
När du använder pimpl-formspråket kräver det inte att kompilera klasser som är beroende av det att byta en privat datamedlem.
Grundläggande Pimpl-formspråk
I rubrikfilen:
// 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
};
I implementeringsfilen:
// 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
}
Den pImpl
innehåller Widget
staten (eller någon / de flesta av det). Istället för att Widget
av tillstånd exponeras i rubrikfilen kan den endast exponeras inom implementeringen.
pImpl
står för "pekare till implementering". Den "riktiga" implementeringen av Widget
finns i pImpl
.
Fara: Observera att för att detta ska fungera med unique_ptr
~Widget()
implementeras vid en punkt i en fil där Impl
är helt synlig. Du kan =default
det där, men om =default
där Impl
är odefinierat kan programmet lätt bli dåligt, ingen diagnostik krävs.