티스토리 뷰
C++/Effective Modern C++
[Effective Modern C++] 항목 22. Pimpl 관용구를 사용할 때에는 특수 멤버 함수들을 구현 파일에서 정의하라
pppgod 2019. 11. 18. 00:08Pimpl 이란 "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;
마찬가지로 이동 연산에 대해서도 구현부에 선언을 해주어야 컴파일 에러가 발생하지 않는다.
'C++ > Effective Modern C++' 카테고리의 다른 글
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- Overloading
- C++11
- Override
- C
- 다이소
- C++
- 보편 참조
- CPP
- C++14
- Join
- 람다
- const
- std::forward
- Forwarding
- thread
- 포인터
- forward
- Effective Modern C++
- 보편참조
- Modern
- async
- std::move
- Effective
- Unreal
- Perfect
- auto
- detach
- 발아시기
- MOVE
- Future
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함