Sök…


Anmärkningar

Pimpl-formspråket ( p ointer till implementering , ibland kallad opak pekare eller cheshire-kattteknik ), minskar sammanställningstiderna för en klass genom att flytta alla sina privata datamedlemmar till en struktur definierad i .cpp-filen.

Klassen äger en pekare till implementeringen. På så sätt kan det förklaras framåt, så att huvudfilen inte behöver #include inkludera klasser som används i privata medlemsvariabler.

När du använder pimpl-formspråket kräver det inte att kompilera klasser som är beroende av det att byta en privat datamedlem.

Grundläggande Pimpl-formspråk

C ++ 11

I rubrikfilen:

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

I implementeringsfilen:

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

Den pImpl innehåller Widget staten (eller någon / de flesta av det). Istället för att Widget av tillstånd exponeras i rubrikfilen kan den endast exponeras inom implementeringen.

pImpl står för "pekare till implementering". Den "riktiga" implementeringen av Widget finns i pImpl .

Fara: Observera att för att detta ska fungera med unique_ptr ~Widget() implementeras vid en punkt i en fil där Impl är helt synlig. Du kan =default det där, men om =default där Impl är odefinierat kan programmet lätt bli dåligt, ingen diagnostik krävs.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow