Suche…


Bemerkungen

Das Pimpl-Idiom ( P ointer to Implementation , manchmal auch als undurchsichtiger Zeiger oder Cheshire-Cat-Verfahren bezeichnet ) reduziert die Kompilierungszeiten einer Klasse, indem alle privaten Datenelemente in eine in der CPP-Datei definierte Struktur verschoben werden.

Die Klasse besitzt einen Zeiger auf die Implementierung. Auf diese Weise kann es vorwärts erklärt werden, so dass die Header - Datei nicht benötigt #include - Klassen , die in der privaten Membervariablen verwendet werden.

Bei Verwendung des Pimpl-Idioms müssen für das Ändern eines privaten Datenelements keine davon abhängigen Klassen neu kompiliert werden.

Grundlegendes Pimpl-Idiom

C ++ 11

In der Headerdatei:

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

In der Implementierungsdatei:

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

Das pImpl enthält den Widget Status (oder einige / die meisten davon). Anstatt die Widget in der Headerdatei verfügbar zu machen, kann sie nur innerhalb der Implementierung verfügbar gemacht werden.

pImpl steht für "Zeiger auf Implementierung". Die "echte" Implementierung von Widget befindet sich im pImpl .

Gefahr: Beachten Sie, dass ~Widget() an einer Stelle in einer Datei implementiert werden muss, an der das Impl vollständig sichtbar ist, damit dies mit unique_ptr Impl . Sie können =default es gibt, aber wenn =default wo Impl nicht definiert ist, wird das Programm leicht schlecht ausgebildet ist , keine Diagnose erforderlich.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow