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

C ++ 11

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 =defaultImpl est indéfini, le programme peut facilement devenir mal formé, aucun diagnostic requis.



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow