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

store pointer to use for event listener registration

本文关键字:指针 注册 侦听器 用于 事件 存储      更新时间:2023-10-16

我有一个我正在编写的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添加为侦听器。

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

也许我只是迂腐 - 但这对你们来说似乎是很好的设计吗?

有几个选项,其优缺点通常值得商榷,取决于您的风格。

单身 人士

如果一个进程只有一个Program实例,那么你可以使Program成为单例。这样,您无需传递指针。

中间对象

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

事实上,如果你不反对使用Boost,那么他们正好有你想要的东西:Signals2库。