C++
Idolo di Pimpl
Ricerca…
Osservazioni
Il linguaggio Pimpl (p ointer a IMPL ementation, talvolta indicato come opaco tecnica puntatore o Cheshire Cat), riduce i tempi di compilazione di una classe spostando tutti i membri di dati privati in una struttura definita nel file cpp.
La classe possiede un puntatore all'implementazione. In questo modo, può essere inoltrato, in modo che il file di intestazione non abbia bisogno di #include
classi utilizzate nelle variabili dei membri privati.
Quando si utilizza l'idioma pimpl, la modifica di un membro dati privato non richiede la ricompilazione di classi che dipendono da esso.
Idioma Pimpl di base
Nel file di intestazione:
// 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
};
Nel file di implementazione:
// 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
}
Il pImpl
contiene lo stato del Widget
(o alcuni / la maggior parte di esso). Invece della descrizione Widget
dello stato esposto nel file di intestazione, può essere esposto solo all'interno dell'implementazione.
pImpl
sta per "pointer to implementation". L'implementazione "reale" di Widget
è in pImpl
.
Pericolo: nota che per far funzionare questa unique_ptr
con unique_ptr
, ~Widget()
deve essere implementato in un punto in un file dove Impl
è completamente visibile. È possibile =default
lì, ma se =default
dove Impl
non è definito, il programma può facilmente diventare mal formato, non è richiesta alcuna diagnostica.