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.