Организация интерфейса библиотеки для работы с 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();

Хотелось бы понять, как лучше организовать интерфейс библиотеки, чтобы он более менее соответствовал представленному в начале.


Ответы (0 шт):