gpt4 book ai didi

c++ - 存储用于事件监听器注册的指针

转载 作者:行者123 更新时间:2023-11-30 04:19:23 44 4
gpt4 key购买 nike

我有一个正在编写的 C++ (C++11) 库(一个 OpenGL 图形引擎)。

我的问题围绕着注册事件监听器的良好编程技术。

我有这样的类关系:

程序 --has--> SceneManager --has--> ShaderManager --has-->* Shader

Shader 类允许其他对象将自己注册为 ShaderBindListener,这意味着每当着色器调用它的 bind() 方法时, 它会通知任何听众。

ShaderManager 类是外部库可以访问的类,他们可以从中创建新的 Shader 对象。

现在,我希望每个 Shader 对象都将 Program 对象作为 ShaderBindListener,这样当一个 Shader 被绑定(bind),Program 对象得到通知,可以将矩阵数据等传递给 GPU 上的 Shader

我最初的解决方案是让 Program 对象将指向自身的指针传递给 SceneManager,后者将指针传递给 ShaderManager,然后存储它。每当创建新的 Shader 时,ShaderManager 都会将 Program 添加为监听器。

这工作得很好 - 但看起来 - 我不知道,在设计方面有点错误。

也许我只是学究气 - 但你们觉得这是好的设计吗?

最佳答案

有几个选项,其优缺点通常是有争议的,并且取决于您的风格。

单例

如果一个进程只有一个 Program 实例,那么您可以将 Program 设为 singleton .这样,您就不需要四处传递指针。

一个中间对象

您可以让它通过封装Program 并管理其事件处理的对象,而不是通过this 指针。这样,其他类不需要了解Program,它们只需要事件类的接口(interface)。

事实上,如果您不反对使用 Boost ,那么他们就有您要找的东西:Signals2图书馆。

关于c++ - 存储用于事件监听器注册的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15858026/

44 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com