Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Идиома Pimpl, (рассуждения на тему) 
:(
    Опции темы
np9mi7
  Дата 20.9.2005, 07:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 553
Регистрация: 17.8.2003
Где: Volgograd, Russia

Репутация: 5
Всего: 10



Добрый день.

При чтении одной, из недавно вышедших в печать, книг (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?
Получаю ответ из следующих строк:
Цитата
Дающий название идиоме указатель должен использоваться для хранения всех закрытых
членов, как данных, так и закрытых функций-членов. Это позволяет вам вносить произволь-
ные изменения в закрытые детали реализации ваших классов без какой бы то ни было реком-
пиляции вызывающего кода.

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

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

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


--------------------
"Я точно знаю то, что ничего не знаю..." Сократ.
evolution project
PM MAIL WWW ICQ MSN   Вверх
Mayk
Дата 20.9.2005, 08:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Цитата(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)
Когда её использовать не нужно?

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

Это сообщение отредактировал(а) Mayk - 20.9.2005, 08:10


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Daevaorn
Дата 20.9.2005, 08:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Эта идиома один из способов уменьшить время компиляции проекта при какком-либо изменении реализации

Это сообщение отредактировал(а) Daevaorn - 20.9.2005, 08:32
PM MAIL WWW   Вверх
Orlan
  Дата 21.9.2005, 09:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 142
Регистрация: 10.6.2004
Где: Киев

Репутация: нет
Всего: 1



Это фактически патерн мост, который служит для разделения интерфейса от реализации что бы первое и второе можно было менять независимо.
--------------------
А вы знали, что терапевт - это 1024 гигапевта или 1048576 мегапевтов
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0502 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.