Что такое техника 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-совместимой со старыми версиями.
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Виртуальный выделенный сервер (VDS) становится отличным выбором
Столкнулся с одной проблемойУ меня есть таблица, в которой по нажатию кнопок можно добавлять, вставлять между существующих строк и удалять...
Есть картридер для чтения карт с магнитной полосойОперационная система его "задействует" как клавиатуру
Подскажите пожалуйста, есть ли в новых версиях стандарта c++ или в стандартной библиотеке функционал работы с битами в больших массивах данных