Техника pimpl c++

146
28 апреля 2019, 15:50

Что такое техника pimpl и когда нужно её использовать?

Answer 1

Идиома 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-совместимой со старыми версиями.

Полезные ссылки

  • Статья на хабре
  • Статья с evileg
  • Вопрос с английского stackoverflow
READ ALSO
Поиск значения в std::vector

Поиск значения в std::vector

Я создал следующую структуру

137
Удаление строк в QTableView

Удаление строк в QTableView

Столкнулся с одной проблемойУ меня есть таблица, в которой по нажатию кнопок можно добавлять, вставлять между существующих строк и удалять...

194
Перехват данных из USB-HID картридера

Перехват данных из USB-HID картридера

Есть картридер для чтения карт с магнитной полосойОперационная система его "задействует" как клавиатуру

140
c++: работа с битами в массивах

c++: работа с битами в массивах

Подскажите пожалуйста, есть ли в новых версиях стандарта c++ или в стандартной библиотеке функционал работы с битами в больших массивах данных

151