C++:静态库,如何制作像openGL这样的"objectless"上下文
C++: Static Library, how to make "objectless" contexts like openGL
OpenGL在基于状态的系统上运行而不声明对象,您能在C++静态库中执行同样的操作吗?
我一直在使用如下所示的单光子技术:
static il_context& get()
{
static il_context sSingleton;
return sSingleton;
}
il_context(){}; // do nothing
~il_context(){}; // do nothing
然而,我的理解是,您必须在启动时将其声明为变量:
il_context ilContext;
有没有一种方法可以在函数调用上自激活singleton?
在您的库中,您可以在命名空间范围内声明一个全局变量:
// 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
指针/引用,并以正常的方式管理其生命周期。对于只能有一个实例的东西,如果对象已经存在,就让构造函数抛出,或者(更好)使用断言来指示程序员的错误。
相关文章:
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 了解 GLM- openGL 中的相机转换
- 如何在全屏模式下(在OpenGL中)使背景透明
- 为什么我不能使用 EGL 创建无头 OpenGl 上下文?
- OpenGL大的3D纹理(>2GB)非常慢
- OpenGl glm rotate
- C++atioglxx.pdb未加载错误glBufferData OpenGL
- OpenGL在启用深度测试时不会丢弃我的碎片
- OpenGL相机和相机空间转型的困惑
- OpenGL将纹理四边形渲染为(0,0)
- OpenGL 和 GLM 矩阵无法正确扩展,总是按比例缩小
- 发布旋转矩阵(openGL/glm)
- 如何在Visual Basic中使用矩形函数OpenGL绘制矩形
- 无法使用VAO和EBO(openGL)绘制多个对象
- 为什么我的点没有在 OpenGL 中绘制鼠标所在的位置?
- OpenGL 16 位模板缓冲区?
- 将QOpenGLWidget子类转换为使用Metal而不是OpenGL的子类是否可行?
- 在顶点着色器中使用 OpenGl 的未声明标识符,我在顶点着色器中绘制三角形时遇到问题
- 在 openGL 中多次绑定缓冲区
- C++:静态库,如何制作像openGL这样的"objectless"上下文