Идиома pimpl в C++: Указатель на реализацию

Идиома pimpl в C++

Идиома pimpl (pointer to implementation — указатель на реализацию) полезна в тех случаях, когда нам нужно что-то скрыть. Она обеспечивает еще более глубокий вид инкапсуляции, которая маскирует не просто реализацию, а также все ее зависимости.

Например, мы создаем библиотеку, которая сама зависит от сторонних библиотек. При этом мы собираемся передать нашу библиотеку кому-то другому без исходников. Чтобы не тянуть зависимости в виде заголовочных файлов (как минимум) и не раскрыть слишком много деталей реализации в интерфейсе класса (как максимум), мы можем воспользоваться идиомой pimpl.

Создаем класс, который нужно замаскировать

Не будем усложнять пример. Рассмотрим лишь общую механику работы pimpl в искусственной ситуации. Идиома является хорошо масштабируемой и без труда распространяется на значительно более сложные проекты.

Заголовочный файл myclass.h:

Обратите внимание, что мы ссылаемся на класс реализации не через #include, а с помощью объявления class MyClassImpl. В этом случае мы можем создавать указатель на этот класс не имея заголовочного файла (который мы и не собираемся распространять).

Переходим к реализации ( myclass.cpp):

Здесь нам уже потребовалось подключить заголовочный файл для MyClassImpl. Но эта часть относится к реализации, поэтому все в порядке. Вызов каждой открытой функции MyClass делегируется соответствующей функции-члену реализации MyClassImpl:

Класс-реализация

Здесь все еще проще. Заголовочный файл myclassimpl.h:

Реализация в myclassimpl.cpp:

Все вместе

Файл main.cpp:

Основное здесь то, что компилятор не требует наличия файла myclassimpl.h в контексте main.cpp. А этого мы и хотели.

Понравилась статья? Поделиться с друзьями:
Добавить комментарий