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 подскажет развёрнутый ответ в реальном времени.