В идиоме pimpl все закрытые члены и функции перемещаются в (приватный) класс реализации. Что делать, если у класса есть приватный конструктор? Должно ли оно быть перенесено в реализацию? Если да, то как?
class X {
private:
X(); // moving it to XImpl???
public:
void DoSomething();
private:
class XImpl;
std::unique_ptr<XImpl> pimpl;
};
PIMPL предназначен для удаления нежелательной зависимости от публичного заголовка по разным причинам. Например, заголовки C используют слово class
(правильность), большие заголовки, добавляющие время сборки (эффективность работы), заголовки с плохими макросами (хрупкость кода). Доступность C ++, private
против public
или же protected
, не имеет к этому никакого отношения, хотя не совсем неестественно, если доступность сильно коррелирует с тем, принадлежат ли функции классу PIMPL или нет: обычно эти функции будут деталями реализации.
Используйте технику, например PIMPL, когда вы ее понимаете, и эта техника является хорошим решением проблемы.
Не применяйте вслепую различные техники, основанные на механических правилах, подобных кулинарной книге. И когда вы ясно видите, что такой набор правил, который вам представлен, неполон, как здесь, тогда правильная реакция — отклонить набор правил, а не просить о его завершении. Это не может быть завершено, вопрос, к которому это приводит, что делать с private
Конструктор не имеет смысла.