1

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

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

我有这样的班级关系:

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

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

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

现在,我希望每个Shader对象都将Program对象作为 a ShaderBindListener,以便在Shader绑定a 时Program通知该对象并且可以将矩阵数据等传递到ShaderGPU 上。

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

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

也许我只是在迂腐——但这对你们来说是不是很好的设计?

4

1 回答 1

2

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

辛格尔顿

如果一个进程只有一个实例Program,那么您可以创建Program一个单例。这样,您不需要传递指针。

中间对象

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

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

于 2013-04-07T02:21:54.807 回答