Чтобы сделать тип dataParseRequest доступным по всему проекту, но при этом скрыть его реализацию (например, сделать его "инкогнито" или скрыть детали реализации), используют информационную скрытие (pImpl идиому) или просто объявляют структуру в заголовочном файле, а реализуют в исходном файле.
Подход 1: Объявление типа в заголовке (информационная скрытие)
Создайте заголовочный файл, например, DataParseRequest.h:
Код: Выделить всё
// DataParseRequest.h
#ifndef DATAPARSE_REQUEST_H
#define DATAPARSE_REQUEST_H
#include <string>
// Объявление структуры (без определения)
struct dataParseRequest;
// Функции для работы с этой структурой
// Например, создание, удаление, доступ к данным, и т.д.
struct dataParseRequest* createDataParseRequest(/* параметры */);
void destroyDataParseRequest(struct dataParseRequest* req);
int getFirstInt(const struct dataParseRequest* req);
int getSecondInt(const struct dataParseRequest* req);
std::string getMessageChatId(const struct dataParseRequest* req);
std::string getMethod(const struct dataParseRequest* req);
std::string getPath(const struct dataParseRequest* req);
std::string getData(const struct dataParseRequest* req);
// ... и так далее
#endif // DATAPARSE_REQUEST_H
А в DataParseRequest.cpp уже определить структуру полностью:
Код: Выделить всё
// DataParseRequest.cpp
#include "DataParseRequest.h"
struct dataParseRequest {
int first;
int second;
std::string message_chat_id;
std::string method;
std::string path;
std::string data;
};
// Реализация функций
struct dataParseRequest* createDataParseRequest(/* параметры */) {
auto* req = new dataParseRequest{/* инициализация */};
return req;
}
void destroyDataParseRequest(struct dataParseRequest* req) {
delete req;
}
// и т.д.
В заголовке объявляется только struct dataParseRequest;, что делает тип известным, но его реализация скрыта.
Пользователи могут создавать указатели на этот тип и работать с функциями, предоставленными API.
Реальная структура полностью скрыта в .cpp, что позволяет избежать ошибок описания типа и скрыть детали реализации.
Если нужно просто сделать так, чтобы тип был объявлен, но его определение было скрыто для пользователя — этот подход отлично подходит.