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 идиома особенно полезна в больших проектах, где стабильность интерфейса и минимизация времени компиляции имеют решающее значение.