수색…


비고

pimpl 관용구, .cpp 파일에 정의 된 구조체에 모든 개인 데이터 멤버를 이동하여 클래스의 컴파일 시간을 감소 (P는 ointer 때로는 불투명 포인터 또는 체셔 고양이 기법이라, ementation을 IMPL합니다).

이 클래스는 구현에 대한 포인터를 소유합니다. 이렇게하면 헤더 파일이 private 멤버 변수에 사용되는 클래스를 #include 할 필요가 없도록 앞으로 선언 될 수 있습니다.

pimpl 관용구를 사용할 때, private 데이터 멤버를 변경해도 private 클래스에 의존하는 클래스를 다시 컴파일 할 필요가 없습니다.

기본 Pimpl 관용구

C ++ 11

헤더 파일에서 :

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

구현 파일에서 :

// 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 에는 Widget 상태 (또는 일부 / 대부분)가 포함됩니다. 헤더 파일에 노출 된 상태에 대한 Widget 설명 대신 구현 내에서만 노출 될 수 있습니다.

pImpl 은 "구현 포인터"를 나타냅니다. Widget 의 "실제"구현은 pImpl 있습니다.

위험 : unique_ptr 과 함께 작동하려면 ~Widget() Impl 가 완전히 표시된 파일의 한 지점에서 ~Widget() 을 구현해야합니다. 거기에 =default 넣을 수 있지만 Impl 이 정의되지 않은 경우 =default 인 경우 프로그램이 쉽게 Impl =default 지며 진단은 필요하지 않습니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow