Что это за шаблон дизайна? Как это использовать? - PullRequest
11 голосов
/ 01 февраля 2012

Предположим, у меня есть такой класс (упрощенно):

class Foo_p;
class Foo
{
private:
  Foo_p *p;
public:
  Foo();
  /* methods, etc... */
};

Этот класс является частью API. Foo_p - это все закрытые части класса, которые не являются объявлен в самом классе Foo как обычно, а скорее в отдельном объявленном заранее классе, который используется только базовой реализацией, не видимой снаружи.

Я видел этот шаблон, использованный в нескольких проектах, есть ли название для него?

Кроме того, как мне правильно его использовать (например, безопасность исключений и т. Д.)? Куда должна идти фактическая реализация? В классе Foo, как обычно, используется только Foo_p для хранения данных, или в классе Foo_p, где Foo является просто оболочкой?

Ответы [ 3 ]

8 голосов
/ 01 февраля 2012
8 голосов
/ 01 февраля 2012

Это известно как PIMPL. приват / указатель на приватную реализацию. Класс Foo_p, ваш класс был бы был реализован в частном порядке и доступен через указатель на него, так что вместо того, чтобы отображать истинный класс для клиентов, они получают доступ только к общедоступному интерфейсу, который вы выбрали. разоблачить. По сути, он отвлекает от заголовка остатки деталей реализации, присутствующих в элементах protected и private.

Я нашел это громоздким в VC ++ - это нарушает завершение кода. Это полезно, если вы очень уверены в своей реализации и не хотите, чтобы члены private и protected отображались в заголовке.

Я поместил фактическую реализацию класса Foo_p в файл cpp для класса Foo, хотя это могло быть причиной нарушения завершения кода, по крайней мере мне не нужно рисковать класс используется повторно путем включения его заголовка.

2 голосов
/ 01 февраля 2012

Это d-указатель, который является типом непрозрачного указателя. Аналогично идиоме PIMPL.

Один тип непрозрачного указателя, обычно используемый в объявлениях класса C ++, D-указатель. D-указатель является единственным закрытым элементом данных класс и указывает на экземпляр структуры. По имени Арнт Гулбрандсен Trolltech, этот метод позволяет объявлениям классов опускать приватные члены данных, за исключением самого d-указателя. [6] Результатом является то, что большая часть реализации класса скрыта от глаз, что добавление новых члены данных в частной структуре не влияют на двоичные совместимость, и что заголовочный файл, содержащий класс декларация должна включать в себя только #include те другие файлы, которые необходимы для интерфейс класса, а не для его реализации. Как сторона выгода, компиляция быстрее, потому что заголовочный файл изменяется меньше довольно часто. D-указатель активно используется в библиотеках Qt и KDE.

https://en.wikipedia.org/wiki/Opaque_pointer#C.2B.2B

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...