- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在尝试使用 glfw 用 C++ 编写一个小型引擎用于创建窗口。我想充分利用 raii 来提出一个异常安全的架构,并使引擎几乎不可能以错误的方式使用。但我目前正在为一些问题而苦苦挣扎,我觉得我错过了一些重要的东西,所以我在这里问,提前谢谢大家!
假设我有一个基本的 raii
-结构称为glfw_context
那叫glfwInit()
在ctor
和 glfwTerminate()
在dtor
.它还接受 error-callback
并在调用 glfwInit()
之前设置它但我会省略这些细节,因为我想专注于基本问题。我还创建了一个类 glfw_window
这需要 const glfw_context&
在ctor
鉴于重载 ctor
采用相同类型的参数,但带有 glfw_context&&
是deleted
.
这背后的想法是,当上下文是 rvalue
时它只会在 ctor
期间存在打电话但glfwTerminate()
将在所有窗口被正确销毁之前调用(这发生在 dtor
类的 glfw_window
中)。我实现了moves
正确为 glfw_window
而 glfw_context
既不能复制也不能移动。但问题从这里开始:我无法阻止用户创建多个 glfw_context
实例。所以我选择了static
自glfw起成为成员(member)不会暴露类似 glfwIsInit() 的内容这在我的框架范围内解决了这个问题(只有最旧的实例会调用 glfwTerminate()
)但是仍然不能保护用户避免编写这样的代码:
std::vector< glfw_window > windows;
{
// introduce explicit scope to demonstrate the problem
glfw_context context{};
windows.emplace_back( context, ... );
}
在这种情况下,上下文仍然不会超过窗口。
有什么好的方法可以解决这个问题吗?我不想将其作为一项要求放入文档中(诸如“上下文必须比每个窗口都长寿”之类的东西似乎对我来说并不适用)。
我目前的方法是使用 std::shared_pointer< glfw_context >
作为 glfw_window
的参数的 ctor
并将其存储为成员。但是这仍然不能解决我的问题,因为我仍然可以 make_shared< glfw_context >()
不同的上下文并将它们传递给不同的窗口。因为只有第一个分配的实例会调用 glfwTerminate()
我仍然可以引发上下文在所有窗口之前被破坏的情况。
那么解决此类问题的正确方法是什么?我可以构建一个无论用户如何尝试(错误)使用它都能在这里正常工作的漂亮架构吗?我的其他一些想法包括 private ctor
在glfw_context
和一个 static
工厂方法结合 shared_pointer
- 方法,但这感觉很像 singleton
我怀疑这是处理问题的最佳方式。
最佳答案
您可能会使用单例的变体:
class glfw_context;
std::shared_ptr<glfw_context> CreateContext(); // Make it visible at global scope
class glfw_context
{
glfw_context() {/*Your impl*/}
glfw_context(const glfw_context&) = delete;
glfw_context& operator=(const glfw_context&) = delete;
public:
friend std::shared_ptr<glfw_context> CreateContext()
{
static std::weak_ptr<glfw_context> instance;
auto res = instance.lock();
if (res == nullptr) {
res = std::make_shared<glfw_context>();
instance = res;
}
return res;
}
/* Your impl */
};
然后只要至少有一个对您的实例的“引用”,CreateContext()
就会返回它,否则它会创建一个新的。
不可能有 2 个不同的 glfw_context
关于c++ - 使用 C++ 和 glfw 的 raii 架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48459639/
GLFW 首字母缩写词代表什么? http://www.glfw.org/是主要网站,但我在那里找不到任何线索。 Evenhere on SO 它有一个标签,但在描述中没有解释首字母缩略词。 最佳答案
我正尝试在我的 mac 上使用 xcode 使用 glfw 2.7.5,但出现以下错误: Undefined symbols for architecture i386: "_glfwGetKey
当我们必须运行多线程glfw应用程序时,如果在MainProcess中调用了glfw.create_window(),程序将停止。 这基本上是更大代码的一部分,我无法更改架构(包括多处理架构),但这是
如何使用 glfw 检测小写字母?我可以检测大写字母。例如, if ( key == 'A' && action == GLFW_PRESS ) std::cout << (char)
如何使用 glfw 检测小写字母?我可以检测大写字母。例如, if ( key == 'A' && action == GLFW_PRESS ) std::cout << (char)
我正在尝试将 GLFW 用于学校项目,并遵循了以下步骤: 1) 从 glfw.org 下载 win32 zip 2) 将/include 添加到我的解决方案的 includes 3) 将/lib-ms
我已经完成了以下视频 https://www.youtube.com/watch?v=shpdt6hCsT4 但是,我的世界窗口看起来像这样: http://s1303.photobucket.com
当我使用 GLFW 创建窗口(在 Windows 操作系统上)并通过 glfwWindowHint(GLFW_TRANSPARENT_FRAMEBUFFER, 1); 将 GLFW_TRANSPARE
我一直在试图让我的窗口可拖动。 这是我的代码, #include #include #include #include "include/GLFW/glfw3.h" void cursor_po
我在识别我机器上的 GLFW 库的代码块 10.05 时遇到了一些困难。当我创建一个空项目并复制粘贴此 GLFW 教程中的代码时 >> http://content.gpwiki.org/index.
在我寻找跨平台框架/库的过程中,GLFW 被多次提及。所以,我决定尝试一下。现在,似乎我什至无法启动窗口。 :-/ #include #include #include int main(int ar
我想将 OpenGL 图形绘制到多个窗口中。据我所知,所有窗口都“通向”同一个“世界”: 在窗口之间共享上下文。这对 GLFW 来说是非常简单的任务,我在这方面取得了一些进展,但是,代码变得越来越模糊
最近我开始了一个涉及 GLFW(64 位,带有 GLEW)的项目。但是,我似乎无法让它正确链接。我的设置方式如下: 操作系统:Windows 8 64位 编译器:mingw64 集成开发环境:ecli
我想将 OpenGL 图形绘制到多个窗口中。据我所知,所有窗口都“通向”同一个“世界”: 在窗口之间共享上下文。这对 GLFW 来说是非常简单的任务,我在这方面取得了一些进展,但是,代码变得越来越模糊
标题已经说明了一切。使用 C 语言的 GLFW 库,我怎样才能防止窗口宽度低于 20 像素,或者 10。怎样才能防止高度不超过 100?我尝试为窗口大小调整时创建一个回调函数,如下所示: void w
所以基本上是从页面上的教程学习 OpenGL 和 GLFW 库:http://www.opengl-tutorial.org/beginners-tutorials/tutorial-6-keyboa
我正在用 OpenGL 和 GLFW 编写游戏引擎。但是,不知何故我的窗口无法关闭。我尝试了很多东西,但没有效果。我的代码有什么问题? 我找不到其中的错误 - 我觉得一切都很好。 代码: int ru
我在创建 GLFW 窗口时遇到了一些问题。我想要一个能够在窗口模式和全屏模式之间切换的程序。要在 GLFW 2.7.8 中执行此操作,必须首先销毁事件窗口,然后创建一个新窗口。我读到 3.0 版支持多
在 GLFW 中设置回调函数时要使用什么数据类型? 我尝试设置一个函数来键入 void,但给我一个编译错误。将其更改为 void __stdcall 会给我一个 RT 错误,但我如何使用 GLFW 的
为了让结果保持打开状态(窗口屏幕),我必须执行以下操作: while (glfwGetWindowParam(GLFW_OPENED)) { // do some stuff glDr
我是一名优秀的程序员,十分优秀!