수색…
비고
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