pimpl 이디엄(관용구)에 대해서 알고있다면 d-pointer가 새롭지 않을것이다. (이를 종종 불투명한 포인터라고 부르기도 한다.)
먼저 Pimpl이란 "pointer to implementation" 이라는 문장의 약자로 클래스의 자료 멤버들을 구현 클래스를 가리키는 포인터로 대체하고 구현클래스(자료 멤버 및 함수들)는 .cpp로 옮겨서 구체적인 코드를 외부로 노출하지 않는 것이다. 제프 섬너(Jeff Sumner)에 의해 제일 먼저 사용되었다.
이 Pimpl 이디엄을 Qt에서는 d-pointer로 불린다. 구현에 대한 변경이 사용자에게 영향을 주지않도록 할 수있으며 API 라이브러리를 동적으로 링크되는 응용프로그램을 다시 컴파일 하지 않고 계속 실행 될 수 있게 호환성을 유지하도록 하는 설계에 적합하다.
Qt의 소스코드를 보면 다음과 같은 코드를 많이 볼 수 있다.
Q_D(xyz);
Q_D 와 같은 매크로는 구현클래스의 포인터(d-pointer를 반환) 제공한다.
qglobal.h
#define Q_D(Class) Class##Private * const d = d_func()
예제:
참고 링크:
https://en.wikipedia.org/wiki/Opaque_pointer#cite_note-4
https://wiki.qt.io/D-Pointer