Szukaj…


Uwagi

Idiom pimpl (p ointer do impl ementation, czasami określane jako mętny wskaźnik lub techniki kota cheshire), zmniejsza czasy zestawiania klasy przenosząc wszystkich członków prywatnych danych do struktury zdefiniowanej w pliku .cpp.

Klasa posiada wskaźnik do implementacji. W ten sposób można go zadeklarować do przodu, dzięki czemu plik nagłówkowy nie musi #include klas, które są używane w zmiennych prywatnych członków.

Podczas używania idiomu pimpl zmiana prywatnego członka danych nie wymaga ponownej kompilacji zależnych od niego klas.

Podstawowy idiom Pimpl

C ++ 11

W pliku nagłówkowym:

// 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
};

W pliku implementacyjnym:

// 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
}

pImpl zawiera stan Widget (lub jego część / większość). Zamiast opisu Widget stanu ujawnionego w pliku nagłówkowym, można go ujawnić tylko w ramach implementacji.

pImpl oznacza „wskaźnik do implementacji”. „Prawdziwy” Realizacja Widget jest w pImpl .

Niebezpieczeństwo: Zauważ, że aby to działało z unique_ptr , ~Widget() musi być zaimplementowany w punkcie pliku, w którym Impl jest w pełni widoczny. Możesz =default to tam, ale jeśli =default gdzie Impl jest niezdefiniowany, program może łatwo zostać źle sformułowany, nie jest wymagana diagnostyka.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow