有几个类通常是由其他类派生的。它们是用户输入接收器,如按键接收器、按键释放接收器、鼠标移动接收器等。继承自这些类的类例如是 hotkey-action,它继承自 key down 接收器和 key release 接收器,或者一个 camera-rotator,它继承自 mouse move 接收器。用户所做的输入将由另一个类转发到相应的接收器,因此任何输入接收器,例如相机旋转器,都需要在该转发类中注册自己。转发输入的类总是相同的,永远不会有两个。
当我的类的用户创建一个新的输入接收器时,一个继承自例如鼠标移动接收器的类,鼠标移动接收器需要知道转发类以便注册自己以接收鼠标输入。所以鼠标移动接收器构造函数的代码如下所示:
mouseMoveReceiverIF(inputforwarder* ifo)
{
ifo.registerInputReceiver(this);
}
由于很明显只有一个输入转发器,如果用户必须传递它不仅不那么直观,而且对于创建的每个输入接收器来说都是额外的输入。
但是,如果我将 inputforwarder 设置为单例或全局变量,以便输入接收器可以访问它而无需用户在构造函数中传递它,我就会遇到其他问题:那么用户需要知道在创建任何输入转发器之前,输入转发器必须存在。没有什么会警告他,没有什么会迫使他首先创建输入转发器。程序会简单地崩溃,因为输入接收器会尝试向不存在的输入转发器注册。那会更糟。
一个有效和正确的方法是怎样的?上述示例的替代方法是什么?
谢谢!