В спокойных Исходных файлах существует две версии заголовочных файлов, такие как:
qxmlstream.h
qxmlstream_p.h
Почему там _p.h файлы?
Обычно это частные заголовочные файлы, используемые для того, чтобы компоненты подсистемы знали обо всем, но пользователям это не нужно.
Другими словами, что-то, о чем могут захотеть узнать несколько исходных файлов C в Qt, будет находиться в частных заголовочных файлах, если пользователям Qt не нужно об этом знать.
Одним из примеров может быть настраиваемый распределитель памяти для вашей подсистемы. Возможно, вы знаете, что каждое ваше выделение памяти составляет 128 байт, тогда вы можете предоставить такой распределитель:
void * malloc128 (void) { ... }
Поскольку это, вероятно, будет иметь сомнительную ценность для пользователей вашей подсистемы, нет смысла публиковать его как часть официального API, но каждый ваш собственный исходный файл нуждается в прототипе, поэтому вы поместите его в частный заголовочный файл.
Тогда ваш собственный код использует:
#include "mysubsystem_p.h"
а пользователи вашего API используют:
#include "mysubsystem.h"
Qt необходимо поддерживать стабильный внешний интерфейс на уровне ссылок. Чтобы решить эту проблему, они используют следующий подход:
class MyClass {
public:
size_t compatSize();
private:
MyClassPrivate *data;
};
// implementation
struct MyClassPrivate {
int someFieldThatCanChange;
};
size_t compatSize() { return (size_t)(data->someFieldThatCanChange); }
Это изменение реализации не влияет на размер и структуру MyClass
. И вы по-прежнему можете добавлять новые поля или удалять старые.
Другой подход - использовать «интерфейсы» (абстрактные классы), фабрики и виртуальные функции для каждого метода, что, я думаю, приведет к более медленному коду.