Что такое техника pimpl и когда нужно её использовать?
Идиома pimpl (pointer to implementation - указатель на реализацию) полезна в тех случаях, когда нам нужно что-то скрыть. Она обеспечивает еще более глубокий вид инкапсуляции, которая маскирует не просто реализацию, а также все ее зависимости.
Например, мы создаем библиотеку, которая сама зависит от сторонних библиотек. При этом мы собираемся передать нашу библиотеку кому-то другому без исходников. Чтобы не тянуть зависимости в виде заголовочных файлов (как минимум) и не раскрыть слишком много деталей реализации в интерфейсе класса (как максимум), мы можем воспользоваться идиомой pimpl.
// widget.h (interface)
class widget {
// public members
private:
struct impl; // forward declaration of the implementation class
// One implementation example: see below for other design options and trade-offs
std::experimental::propagate_const< // const-forwarding pointer wrapper
std::unique_ptr< // unique-ownership opaque pointer
impl>> pImpl; // to the forward-declared implementation class
};
// widget.cpp (implementation)
struct widget::impl {
// implementation details
};
Этот метод используется для создания интерфейсов библиотеки C ++ со стабильным ABI и сокращения зависимостей во времени компиляции.
Поскольку частные члены данных класса участвуют в представлении объекта, влияя на размер и макет, а также потому, что частные функции-члены класса участвуют в разрешении перегрузки (что происходит до проверки доступа к членству), любое изменение этих деталей реализации требует перекомпиляции всех пользователей класса.
pImpl нарушает эту зависимость от компиляции; изменения в реализации не вызывают перекомпиляции. Следовательно, если библиотека использует pImpl в своем ABI, более новые версии библиотеки могут изменить реализацию, оставаясь ABI-совместимой со старыми версиями.
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости