Кто-то может дать мне пример того, как общедоступные и частные заголовки работают? Я сделал некоторое чтение в сети, но я, может казаться, не нахожу много полезной информации с примерами кода. Мне сообщили, что я должен использовать частные заголовки для разделения общедоступных и половых органов моего кода для создания статической библиотеки. После некоторого чтения у меня есть общее представление о том, как оно работает, но действительно ценило бы хороший пример для запущения меня. А именно, что я не вполне понимаю, то, как поместить функции интерфейса в мой общедоступный заголовок и частные переменные/функции в моем частном заголовке? Спасибо!
Править:
Возможно, я не формулирую свое право вопроса, но что я имел в виду, например, у меня есть myMath.h и myMath.cpp, и myMath.h имеет:
class myMath{
public:
void initialise(double _a, double _b);
double add();
double subtract();
private:
double a;
double b;
};
И myMath.cpp имеет реализации функций. Как я могу сделать его так, чтобы myMath.h только имел эти три государственных функции, и частные переменные определяются в другом файле (например, myMath_i.h), и эти три файла находятся таким способом, которым после того, как я создаю статическую библиотеку, только myMath.h необходим пользователям. Это также означает, что myMath.h не может #include myMath_i.h. Так что-то как:
myMath.h:
class myMath{
public:
void initialise(double _a, double _b);
double add();
double subtract();
}
и myMath_i.h:
class myMath{
private:
double a;
double b;
}
Конечно, это не возможно, потому что тогда я буду переопределять класс myMath...
У вас есть два файла заголовков MyClass.h и MyClass_p.h и один исходный файл: MyClass.cpp.
Давайте посмотрим, что внутри них:
MyClass_p.h:
// Header Guard Here
class MyClassPrivate
{
public:
int a;
bool b;
//more data members;
}
MyClass.h:
// Header Guard Here
class MyClassPrivate;
class MyClass
{
public:
MyClass();
~MyClass();
void method1();
int method2();
private:
MyClassPrivate* mData;
}
MyClass.cpp:
#include "MyClass.h"
#include "MyClass_p.h"
MyClass::MyClass()
{
mData = new MyClassPrivate();
}
MyClass::~MyClass()
{
delete mData;
}
void MyClass::method1()
{
//do stuff
}
int MyClass::method2()
{
return stuff;
}
Храните ваши данные в MyClassPrivate и распространяйте MyClass.h.
Общедоступные заголовки - это те, которые необходимы пользователям библиотеки. Частные заголовки необходимы для компиляции библиотеки, но не нужны пользователям библиотеки. Выполнение разделения может быть довольно сложным, и многие библиотеки просто не беспокоят.
Вы можете объявить все интерфейсы и константы, которые вы хотите предоставить пользователю библиотеки, в отдельном файле заголовка (или в наборе файлов) и поместить его в подкаталог inc - эти заголовки будут «общедоступными». Вы также будете использовать другие файлы заголовков для объявления классов и прочего, что вы не хотите раскрывать, поскольку это детали реализации - вы поместите эти файлы в подкаталог «src» - они будут «частными».
Таким образом, пользователю будет дана подсказка, что он должен включать только общедоступные заголовки - те, которые находятся в "inc", и только эти заголовки содержат то, что ему действительно нужно, в то время как все остальные заголовки являются "частными" и не используются. области его интересов, если он не хочет углубляться в реализацию.
Когда вы публикуете свою библиотеку как двоичную - статическую или динамическую - вы копируете только содержимое «inc» и результат компиляции - этого достаточно для пользователя, и таким образом он не видит исходные тексты вашей реализации.