Sobes.tech
Middle+
123
questionbank

Расшифруйте аббревиатуру PIMPL.

Ответ от нейросети

sobes.tech AI

Pointer to IMPLementation.

Идиома проектирования в C++, скрывающая реализацию класса за указателем на структуру или класс, определенный в .cpp файле. Это уменьшает зависимости между заголовочными и исходными файлами, ускоряя компиляцию.

Пример:

Foo.h:

// Foo.h
#pragma once

#include <memory>

class Foo {
public:
    Foo();
    ~Foo();

    void doSomething();

private:
    class Impl; // Предварительное объявление
    std::unique_ptr<Impl> pimpl_;
};

Foo.cpp:

// Foo.cpp
#include "Foo.h"
#include <iostream> // Этот заголовок виден только здесь

class Foo::Impl { // Определение класса Impl
public:
    void doSomethingImpl() {
        std::cout << "Doing something inside implementation.\n";
    }
};

Foo::Foo() : pimpl_(std::make_unique<Impl>()) {} // Создание объекта Impl

Foo::~Foo() = default; // Деструктор сгенерирован по умолчанию

void Foo::doSomething() {
    pimpl_->doSomethingImpl(); // Делегирование вызова Impl
}

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

  • Ускорение компиляции: Изменения в приватной части класса Impl в .cpp файле не требуют перекомпиляции .h файлов, которые включают Foo.h.
  • Инкапсуляция: Приватные детали реализации полностью скрыты от клиентов класса.
  • Уменьшение зависимостей: Заголовочные файлы, необходимые для реализации (<iostream> в примере), не включаются в публичный заголовочный файл.

Недостатки:

  • Издержки производительности: Дополнительный уровень косвенности через указатель и динамическое выделение памяти.
  • Усложнение кода: Требует определения внутреннего класса и перенаправления вызовов.
  • Обработка исключений: Требует внимания при работе с исключениями и ресурсами внутри Impl.
  • Семантика перемещения: Требует явного определения конструктора и оператора перемещения (или использования std::unique_ptr).