티스토리 뷰

 Pimpl 이란 "pointer to implementation" 을 의미한다. 코드를 먼저 살펴보자.

기존코드

class Widget {
public:
    Widget();
    ...
private:
    std::string name;
    std:;vector<double> data;
    Gadget g1, g2, g3;
};

Pimpl 적용 코드

class Widget {
public:
    Widget();
    ~Widget();
    ...
private:
    struct Impl;
    Impl *pImpl;
};

 Pimpl 적용 코드를 보면 std::string, std::vector, Gadget 을 선언하지 않고 있기 때문에 #include 할 필요가 없어졌다. 덕분에 컴파일 속도가 빨라지게 되었다. 이렇게 선언만 하고 정의를 하지 않는 형식을 불완전한 형식이라고 한다.

구현부에는 다음과 같이 작성하면 된다.

struct Widget::Impl {
    std::string name;
    std:;vector<double> data;
    Gadget g1, g2, g3;
};

Widget::Widget()
: pImpl(new Impl)
{}

Widget::~Widget()
{ delete pImpl; }

 여기서 pImpl 을 살펴보면 unique_ptr 를 사용하기 적합한 상황임을 알 수 있다. 하지만 unique_ptr 를 사용하게 되면 컴파일이 되지 않는다. 그 이유는 컴파일러가 자동으로 pImpl 의 소멸자를 호출하는데 Impl 은 불완전한 형식이기 때문이다. 해결법은 간단하다. 구현부에 소멸자를 선언하면 된다.

struct Widget::Impl {
    std::string name;
    std:;vector<double> data;
    Gadget g1, g2, g3;
};

Widget::Widget()
: pImpl(std::make_unique<Impl>())
{}

Widget::~Widget() = default;

마찬가지로 이동 연산에 대해서도 구현부에 선언을 해주어야 컴파일 에러가 발생하지 않는다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/03   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
글 보관함