Организация интерфейса библиотеки для работы с API сайта
решил попробовать создать свою библиотеку для работы с 1 сайтом. Сама реализация не сложная, но больше стоит вопрос как предоставить пользователю примерно вот такой интерфейс.
#include "api.h"
api object;
object.authorization(login, pass);
object.modules1.get_profile_info().name();
object.modules2.get_car_info().mark();
//где modules могут быть различные и иметь свои методы.
В данный момент все организованно вот так.
Я имею класс utils. Который имеет методы для отправки запросов к сайту и хранит в себе необходимые переменные для выполнения этих запросов.
class utils
{
public:
utils();
~utils();
void request(); // отправка запросов к api сайта
protected:
std::string json; // json который приходит от сайта.
std::string token;
// Требуется для отправки запросов к api сайта. Получаем при авторизации.
// в наследники api.
};
Класс api. Выполняет авторизацию и получение tokena, а также хранит в себе определенные модули, такие как account.
#include "utils.h"
class account;
class api : protected utils
{
public:
account* account{}; // Не полный тип, вот тут и начинается основная проблема.
public:
api();
~api() noexcept = default;
bool authorization(const std::string& login, const std::string& password);
};
Класс account имеет основные методы для работы с модулем account. И обращается к токену и функциям из класса utils. Для этого мне и потребовалось наследование от api. Если наследоваться от utils то я не смогу отправлять запросы используя токен, так как каждый класс создаст свой объект utils. А если в api подключить account то я получу рекурсивное включение заголовков.
#include "api.h"
class account : protected api
{
public:
account() = default;
~account() noexcept = default;
[[maybe_unused]] info get_info();
Хотелось бы понять, как лучше организовать интерфейс библиотеки, чтобы он более менее соответствовал представленному в начале.