MediumpImplbest practices

Что такое pImpl (pointer to implementation) идиома?

1Постановка

Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.

2Решение

pImpl: класс хранит указатель на реализацию в .cpp, всё скрыто. Уменьшает compile-time зависимости, даёт ABI stability, скрывает приватные детали из заголовка.

// widget.h — минимальный публичный интерфейс
class Widget {
public:
    Widget();
    ~Widget();   // ОБЯЗАТЕЛЬНО определить в .cpp (incomplete type)
    void doStuff();
private:
    struct Impl;
    std::unique_ptr<Impl> impl_;
};

// widget.cpp — полное определение Impl
struct Widget::Impl { std::vector<int> data; int state; };
Widget::Widget() : impl_(std::make_unique<Impl>()) {}
Widget::~Widget() = default;   // теперь complete type
void Widget::doStuff() { impl_->state++; }
  • Изменение Impl не требует перекомпиляции клиентов;
  • Можно менять реализацию, не ломая binary compatibility;
  • Минусы: одна extra indirection на доступ, одна extra allocation.

Применяется в библиотеках с публичным API.

3Как отвечать

  • Сначала уточните условия и ограничения, покажите аналитическое мышление.
  • Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
  • Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡

На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.