PIMPL
Основные идеи Pimpl идиомы
Основная идея Pimpl идиомы заключается в том, чтобы разделить объявление класса и его реализацию, используя указатель на частную структуру данных. Это позволяет изменять реализацию класса без необходимости перекомпиляции всех файлов, зависящих от этого класса.
Преимущества Pimpl
- Улучшенная инкапсуляция: Реализация класса скрыта от внешнего мира.
- Сокращение времени компиляции: Изменения в реализации не требуют перекомпиляции всех зависимых файлов.
- Снижение зависимости: Заголовочные файлы содержат только интерфейс, а не детали реализации.
Пример использования Pimpl
Шаг 1: Объявление класса и указателя на его реализацию
Создадим класс Widget, который использует Pimpl идиому:
#ifndef WIDGET_H#define WIDGET_H
#include <memory>
class Widget {public: Widget(); ~Widget();
void doSomething();
private: struct Impl; std::unique_ptr<Impl> pImpl;};
#endif // WIDGET_HВ этом заголовочном файле объявлен класс Widget, который содержит указатель pImpl на структуру Impl, представляющую реализацию.
Шаг 2: Реализация класса
Теперь реализуем класс Widget и его структуру Impl в отдельном cpp-файле:
#include "Widget.h"#include <iostream>
struct Widget::Impl { void doSomethingImpl() { std::cout << "Doing something!" << std::endl; }};
Widget::Widget() : pImpl(std::make_unique<Impl>()) {}
Widget::~Widget() = default;
void Widget::doSomething() { pImpl->doSomethingImpl();}Здесь структура Impl содержит все детали реализации, включая метод doSomethingImpl. Конструктор Widget инициализирует pImpl, а метод doSomething делегирует работу doSomethingImpl.
Резюме
Pimpl идиома в C++ — это метод разделения объявления и реализации класса, использующий указатель на частную структуру данных для хранения деталей реализации. Это улучшает инкапсуляцию, сокращает время компиляции и уменьшает зависимость от изменений в реализации. Pimpl идиома особенно полезна в больших проектах, где стабильность интерфейса и минимизация времени компиляции имеют решающее значение.