Что это за шаблон? Как это использовать?

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

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

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

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

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

Ответ 1

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

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

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

Ответ 2

Это идиома pimpl

См.

Ответ 3

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

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

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