C++
Pimpl Idiom
Recherche…
Remarques
L'idiome de Pimpl (p ointer à impl ementation, parfois appelé pointeur ou technique chat cheshire opaque), réduit les temps de compilation d'une classe en déplaçant tous ses membres de données privées dans un struct défini dans le fichier .cpp.
La classe possède un pointeur sur l'implémentation. De cette façon, il peut être déclaré de manière à ce que le fichier d'en-tête n'ait pas besoin d' #include
classes utilisées dans les variables de membre privé.
Lors de l'utilisation de l'idiome pimpl, la modification d'un membre de données privé ne nécessite pas de recompiler les classes qui en dépendent.
Idiome de base de Pimpl
Dans le fichier d'en-tête:
// 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
};
Dans le fichier d'implémentation:
// 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
}
Le pImpl
contient l'état du Widget
(ou une partie / la majeure partie). Au lieu que la description de l'état du Widget
soit exposée dans le fichier d'en-tête, elle ne peut être exposée que dans l'implémentation.
pImpl
signifie "pointer to implementation". La "vraie" implémentation de Widget
trouve dans pImpl
.
Danger: Notez que pour que cela fonctionne avec unique_ptr
, ~Widget()
doit être implémenté en un point dans un fichier où l' Impl
est entièrement visible. Vous pouvez =default
, mais si =default
où Impl
est indéfini, le programme peut facilement devenir mal formé, aucun diagnostic requis.