OpenGL запускается в государственной системе без объявления объектов, можете ли вы сделать то же самое в статической библиотеке C++?
Я использовал технику sSingleton, показанную ниже:
static il_context& get()
{
static il_context sSingleton;
return sSingleton;
}
il_context(){}; // do nothing
~il_context(){}; // do nothing
Однако я понимаю, что вы должны объявить его как переменную при запуске:
il_context ilContext;
Есть ли способ самостоятельно активировать синглтон при вызове функции?
В своей библиотеке вы можете объявить глобальную переменную в области пространства имен:
// 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
сами и управлять его продолжительностью жизни обычным способом. Для чего-то, у которого может быть только один экземпляр, вы можете создать конструктор, если объект уже существует, или (лучше) использовать утверждение, чтобы указать ошибку программиста.