Zoeken…


Opmerkingen

Het pimpl-idioom ( p ointer tot implementatie , ook wel ondoorzichtige pointer of cheshire cat-techniek genoemd ), vermindert de compilatietijden van een klasse door alle privégegevensleden te verplaatsen naar een struct die is gedefinieerd in het .cpp-bestand.

De klas bezit een pointer naar de implementatie. Op deze manier kan het op voorhand worden gedeclareerd, zodat het headerbestand geen #include hoeft te bevatten die worden gebruikt in variabelen voor privéleden.

Wanneer u het pimpl-idioom gebruikt, hoeft u voor het wijzigen van een particulier gegevenslid geen klassen opnieuw te compileren die hiervan afhankelijk zijn.

Basic Pimpl-idioom

C ++ 11

In het header-bestand:

// 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 het implementatiebestand:

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

De pImpl bevat de Widget status (of een deel ervan). In plaats van de Widget van de status die in het headerbestand wordt weergegeven, kan deze alleen binnen de implementatie worden weergegeven.

pImpl staat voor "pointer naar implementatie". De "echte" implementatie van Widget staat in de pImpl .

Gevaar: Merk op dat om dit te laten werken met unique_ptr , ~Widget() moet worden geïmplementeerd op een punt in een bestand waar de Impl volledig zichtbaar is. U kunt het daar =default , maar als =default waar Impl is gedefinieerd, kan het programma gemakkelijk Impl worden, geen diagnose vereist.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow