2012-01-31 4 views
11

Предположим, у меня есть класс, как это (упрощенный):Что это за шаблон? Как это использовать?

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

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

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

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

ответ

8

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

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

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

+0

Не как заголовки и нормальные уровни защиты (государственные/частные) «по существу скрыть реализацию»? –

+0

@ Матвей: К сожалению, нет. Вы должны включить заголовки реализации, которые часто могут быть неудобными, когда они зависят от, например, заголовков Windows, которые, к сожалению, являются плохими. – Puppy

+0

@MatthewFlaschen: Да, но только в том смысле, что вы не можете получить к нему доступ, но вы все еще можете видеть это, глядя на код. – bitmask

8

Это Pimpl идиома

См

+0

Спасибо за ссылки! – kralyk

+0

Ссылки мертвы :( – pmb

+1

@pmb Спасибо за подсказку. Исправлены все три ссылки. _o.O permalinks ... когда они работали, они были так хороши_ :( – sehe

2

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

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

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

+0

Присвойте свои источники. –