Частный/общедоступный пример заголовка?

Кто-то может дать мне пример того, как общедоступные и частные заголовки работают? Я сделал некоторое чтение в сети, но я, может казаться, не нахожу много полезной информации с примерами кода. Мне сообщили, что я должен использовать частные заголовки для разделения общедоступных и половых органов моего кода для создания статической библиотеки. После некоторого чтения у меня есть общее представление о том, как оно работает, но действительно ценило бы хороший пример для запущения меня. А именно, что я не вполне понимаю, то, как поместить функции интерфейса в мой общедоступный заголовок и частные переменные/функции в моем частном заголовке? Спасибо!

Править:

Возможно, я не формулирую свое право вопроса, но что я имел в виду, например, у меня есть 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...

27
задан chocobo_ff 16 February 2010 в 12:27
поделиться

3 ответа

У вас есть два файла заголовков 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.

23
ответ дан 28 November 2019 в 05:30
поделиться

Общедоступные заголовки - это те, которые необходимы пользователям библиотеки. Частные заголовки необходимы для компиляции библиотеки, но не нужны пользователям библиотеки. Выполнение разделения может быть довольно сложным, и многие библиотеки просто не беспокоят.

2
ответ дан 28 November 2019 в 05:30
поделиться

Вы можете объявить все интерфейсы и константы, которые вы хотите предоставить пользователю библиотеки, в отдельном файле заголовка (или в наборе файлов) и поместить его в подкаталог inc - эти заголовки будут «общедоступными». Вы также будете использовать другие файлы заголовков для объявления классов и прочего, что вы не хотите раскрывать, поскольку это детали реализации - вы поместите эти файлы в подкаталог «src» - они будут «частными».

Таким образом, пользователю будет дана подсказка, что он должен включать только общедоступные заголовки - те, которые находятся в "inc", и только эти заголовки содержат то, что ему действительно нужно, в то время как все остальные заголовки являются "частными" и не используются. области его интересов, если он не хочет углубляться в реализацию.

Когда вы публикуете свою библиотеку как двоичную - статическую или динамическую - вы копируете только содержимое «inc» и результат компиляции - этого достаточно для пользователя, и таким образом он не видит исходные тексты вашей реализации.

10
ответ дан 28 November 2019 в 05:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: