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

C ++ 11

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.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow