Перейти к содержимому

PIMPL

Основные идеи Pimpl идиомы

Основная идея Pimpl идиомы заключается в том, чтобы разделить объявление класса и его реализацию, используя указатель на частную структуру данных. Это позволяет изменять реализацию класса без необходимости перекомпиляции всех файлов, зависящих от этого класса.

Преимущества Pimpl

  • Улучшенная инкапсуляция: Реализация класса скрыта от внешнего мира.
  • Сокращение времени компиляции: Изменения в реализации не требуют перекомпиляции всех зависимых файлов.
  • Снижение зависимости: Заголовочные файлы содержат только интерфейс, а не детали реализации.

Пример использования Pimpl

Шаг 1: Объявление класса и указателя на его реализацию

Создадим класс Widget, который использует Pimpl идиому:

Widget.h
#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-файле:

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