@undeadter

C++ как инкапсулировать глобальную функцию в обьект?

#include <physfs/physfs.h>
int main() {
    PHYSFS_init(NULL);
    PHYSFS_addToSearchPath("res.data", 1);
    
    if (PHYSFS_exists()) {
        /////////////////
       // PHYSFS_exists доступна во всем коде, даже если вызывать PHYSFS_init() в классе
       /////////////////
    }
}


Как сделать чтобы библиотека инициализировалась только внутри обьекта?
Например:
в первом PHYSFS_addToSearchPath("res.data", 1);
а во втором PHYSFS_addToSearchPath("res2.data", 1);
  • Вопрос задан
  • 273 просмотра
Пригласить эксперта
Ответы на вопрос 4
Rou1997
@Rou1997
Воспользоваться ее ООП-версией если это Qt, либо смотреть в сторону ее кода, если она не поддерживает дескрипторы ("handle"), то их надо дописать.
Ответ написан
Комментировать
Zifix
@Zifix Куратор тега Qt
Barbatum
Синглтон?
Ответ написан
Комментировать
@Mercury13
Программист на «си с крестами» и не только
Что вы имеете в виду? Инициализировать и закрыть библиотеку по мере появления-исчезновения объектов? Вот мой код (работает с cURL, но понятно).

В чём его смысл? Как только объект cURL требуется первый раз, инициализируем глобальный объект. Теперь, скорее всего, cURL будет разрушен с его деструктором. Но если в каком-то потоке объект cURL будет слишком долго жить — ничего, подождём.

(Внимание, тут гонка, если одновременно потребуются два объекта cURL. Нам такое не нужно, но если вдруг — защитите по принципу Singleton’а.)

namespace curl {

    std::atomic<size_t> nLib(0);

    class _Lib
    {
    public:
        bool isIn = false;
        ~_Lib();
    };

    _Lib lib;

    void addLib()
    {
        int q = ++nLib;
        if (q == 1) {
            lib.isIn = true;
            q = ++nLib;
            curl_global_init(CURL_GLOBAL_ALL);
        }
        //std::cout << "Added lib, now " << q << std::endl;
    }

    void releaseLib()
    {
        int q = --nLib;
        if (q == 0) {
            //std::cout << "Cleaned up lib" << std::endl;
            curl_global_cleanup();
        } else {
            //std::cout << "Released lib, now " << q << std::endl;
        }
    }

    _Lib::~_Lib()
    {
        if (isIn)
            releaseLib();
    }

}

curl::Curl::Curl()
{
    addLib();
    fData.handle = curl_easy_init();
}

curl::Curl::~Curl()
{
    if (fData.handle)
        curl_easy_cleanup(fData.handle);
    releaseLib();
}
Ответ написан
Комментировать
BacCM
@BacCM
C++ почти с рождения
Отдельный модуль cpp/h
#include включена только в этот h
И на все нужные функции свои врапперы, с проверкой дополнительного флага, вызывался ли инит.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы