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
。
我个人的感觉是,拥有像这样的隐藏上下文单例比它的值(value)更麻烦,最好让客户自己传递一个 Context
指针/引用并管理它的生命周期正常的方式。对于只能有单个实例的对象,如果对象已经存在,则让构造函数抛出异常,或者(更好)使用断言来指示程序员的错误。
关于C++:静态库,如何使 "objectless"上下文像 openGL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21900032/