存储用于事件侦听器注册的指针

时间:2013-04-07 01:47:40

标签: c++ design-patterns

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

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

我有这样的阶级关系:

Program - has - > SceneManager - has - > ShaderManager - has - > * Shader

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

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

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

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

这很好用 - 但似乎 - 我不知道,在设计方面有点不对。

也许我只是在迂腐 - 但这对你们来说这看起来不错吗?

1 个答案:

答案 0 :(得分:2)

有一些选择,其优缺点往往是有争议的,取决于你的风格。

<强>的Singleton

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

中间对象

不是传递this指针,而是让它通过一个封装Program的对象并管理它的事件处理。这样,其他类不需要知道Program,他们只需要事件类的接口。

事实上,如果您不反对使用Boost,那么它们就是您正在寻找的内容:Signals2库。