Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Идиома Pimpl


Автор: np9mi7 20.9.2005, 07:42
Добрый день.

При чтении одной, из недавно вышедших в печать, книг (C++ Coding Standards: 101 Rules, Guidelines and Best Practices (C++ In-Depth)), натулкнулся на совет:
Цитата
C++ делает закрытые члены недоступными, но не невидимыми. Там, где это оправдывает-
ся получаемыми преимуществами, следует подумать об истинной невидимости, достигаемой
применением идиомы Pimpl (указателя на реализацию) для реализации брандмауэров компи-
лятора и повышения сокрытия информации (см. рекомендации 11 и 41).

После чего приводиться пример:
Код

class Map {
// ...
private:
struct Impl;
shared_ptr <Impl> pimpl_;
};

У меня возникает очевидный вопрос: А что внурти Impl?
Получаю ответ из следующих строк:
Цитата
Дающий название идиоме указатель должен использоваться для хранения всех закрытых
членов, как данных, так и закрытых функций-членов. Это позволяет вам вносить произволь-
ные изменения в закрытые детали реализации ваших классов без какой бы то ни было реком-
пиляции вызывающего кода.

После чтения всей статьи целиком у меня так и не отложилось в голове для чего нужна данная идиома? Когда её использовать? Когда её использовать не нужно?

Может кто поможет в поисках ответов на данные вопросы?

Заранее благодарен за ответы.

Автор: Mayk 20.9.2005, 08:08
Цитата(np9mi7 @ 20.9.2005, 11:42)
для чего нужна данная идиома? Когда её использовать?

Когда ты не хочешь, чтоб пользователи мог видеть внутреннюю структуру. Например при написании коммерческой либы.
Или, например, когда реализация может отличаться для разных ситуаций(например для разных осей). Так ты можешь сделать
Код

class WindowClass
{
   WindowClassImpl* impl;
};

А WindowClassImpl имплементить в файлах windowclassimpl_win32.cpp и windowsclassimpl_x11.cpp. А при сборке указывать явно что нужно собирать(windowclassimpl_win32.cpp или windowsclassimpl_x11.cpp) и линковать.

Цитата(np9mi7 @ 20.9.2005, 11:42)
Когда её использовать не нужно?

Когда не хочешь, тогда и не используй.

Автор: Daevaorn 20.9.2005, 08:32
Эта идиома один из способов уменьшить время компиляции проекта при какком-либо изменении реализации

Автор: Orlan 21.9.2005, 09:55
Это фактически патерн http://en.wikipedia.org/wiki/Bridge_pattern, который служит для разделения интерфейса от реализации что бы первое и второе можно было менять независимо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)