Pointer to IMPLementation.
Идиома проектирования в C++, скрывающая реализацию класса за указателем на структуру или класс, определенный в .cpp файле. Это уменьшает зависимости между заголовочными и исходными файлами, ускоряя компиляцию.
Пример:
Foo.h:
cpp
Foo.cpp:
cpp
Преимущества:
- Ускорение компиляции: Изменения в приватной части класса
Impl в .cpp файле не требуют перекомпиляции .h файлов, которые включают Foo.h.
- Инкапсуляция: Приватные детали реализации полностью скрыты от клиентов класса.
- Уменьшение зависимостей: Заголовочные файлы, необходимые для реализации (
<iostream> в примере), не включаются в публичный заголовочный файл.
Недостатки:
- Издержки производительности: Дополнительный уровень косвенности через указатель и динамическое выделение памяти.
- Усложнение кода: Требует определения внутреннего класса и перенаправления вызовов.
- Обработка исключений: Требует внимания при работе с исключениями и ресурсами внутри
Impl.
- Семантика перемещения: Требует явного определения конструктора и оператора перемещения (или использования
std::unique_ptr).