C ++: статическая библиотека, как создавать «безобъектные» контексты, такие как openGL

0

OpenGL запускается в государственной системе без объявления объектов, можете ли вы сделать то же самое в статической библиотеке C++?

Я использовал технику sSingleton, показанную ниже:

static il_context& get()
{
    static il_context sSingleton;
    return sSingleton;
}
il_context(){}; // do nothing
~il_context(){}; // do nothing

Однако я понимаю, что вы должны объявить его как переменную при запуске:

il_context ilContext;

Есть ли способ самостоятельно активировать синглтон при вызове функции?

Теги:
opengl
static-libraries
game-engine

1 ответ

2
Лучший ответ

В своей библиотеке вы можете объявить глобальную переменную в области пространства имен:

// In library.cpp
Context ctx;

void library_func()
{
    // Do something to ctx
}

Если ваша библиотека имеет несколько исходных файлов, вам нужно использовать ключевое слово extern чтобы сообщить компилятору, что ctx существует в другой единицы перевода:

// In library2.cpp
extern Context ctx;

void other_library_func()
{
    // Do something else to ctx
}

Кроме того, вы можете использовать функцию (не публично открытую в вашей библиотеке) для создания ctx при первом использовании (так называемый Meyers Singleton, используемый в вашем примере):

Context& get_context()
{
    static Context ctx;
    return ctx;
}

в этом случае первая строка реализации вашей функции вызовет get_context():

void library_func()
{
    Context& ctx = get_context();
    // Do something to ctx
}

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

Мое личное чувство заключается в том, что наличие скрытого контекстного синглтона, подобного этому, является большим количеством проблем, чем того стоит, и лучше разрешить клиентам передавать указатель/ссылку Context сами и управлять его продолжительностью жизни обычным способом. Для чего-то, у которого может быть только один экземпляр, вы можете создать конструктор, если объект уже существует, или (лучше) использовать утверждение, чтобы указать ошибку программиста.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню