C++ c+的事件系统+;

C++ c+的事件系统+;,c++,C++,我在blender的GHOST系统的基础上创建了一个简单的GUI系统,我认为在这个问题上这并不是很重要。GHOST本身具有简单的事件系统 我的事件系统应该是灵活的,允许某种MVC模式的实现,智能内存释放,应该跨平台工作,应该用c++0x编写 下面的示例显示了从处理事件的GHOST继承的方法 bool Application::processEvent(GHOST_IEvent *event) { GHOST_IWindow *window = event->getWindow();

我在blender的GHOST系统的基础上创建了一个简单的GUI系统,我认为在这个问题上这并不是很重要。GHOST本身具有简单的事件系统

我的事件系统应该是灵活的,允许某种MVC模式的实现,智能内存释放,应该跨平台工作,应该用c++0x编写

下面的示例显示了从处理事件的GHOST继承的方法

bool Application::processEvent(GHOST_IEvent *event)
{
    GHOST_IWindow *window = event->getWindow();
    bool handled = true;

    switch (event->getType()) {

        case GHOST_kEventWheel:
        {
            mouseDriver->handleWheel((GHOST_TEventWheelData *) event->getData());
        }
        break;  
        case GHOST_kEventButtonDown:
        {
            mouseDriver->handleButtonDown((GHOST_TEventButtonData *) event->getData());
        }
        break;  
        case GHOST_kEventButtonUp:
        {
            mouseDriver->handleButtonUp((GHOST_TEventButtonData *) event->getData());
        }
        break;

        case GHOST_kEventCursorMove:
        {
              mouseDriver->handleCursorMove((GHOST_TEventCursorData *) event->getData());
        } 
        break;

        case GHOST_kEventKeyUp:
        {
            keyDriver->handleKeyUp((GHOST_TEventKeyData *) event->getData());       
        }
        break;
        case GHOST_kEventKeyDown:
        {
            keyDriver->handleKeyDown((GHOST_TEventKeyData *) event->getData()); 
        }
        break;
    }
    return true;//currently not used while experimenting`
}
我已经编写了两个类KeyDriver和MouseDriver,它们应该处理GHOST事件并通知那些对事件感兴趣的人。现在真正的问题是,从驱动程序类实现进一步事件分发的最佳实践是什么,我已经阅读了几篇文章和解决方案事件系统是如何工作的或,但我不知道选择哪一个以及为什么一个比另一个更好

我曾经想过像java中的Swing那样做。创建并注册侦听器类以侦听组件事件,并且侦听器类必须从某个类继承

为什么这种方法比使用回调函数的函子更糟糕? 您会选择哪种实现及其原因?

我使用Boost.Signals2(这是您已经提到的公认答案)。我在三四年前第一次学习Boost库时就开始使用它,它被证明是简单、灵活、优雅和可靠的;我没有理由去寻找另一个解决方案

我已经有一段时间没有使用Swing了,所以我无法对它进行深入的评论。使用Signals2,您仍然可以“创建”一个“侦听器类”(通过定义一个信号类型;侦听器是结果插槽类型);然后通过
connect()
方法将侦听器“注册”到给定的信号实例

对于信号2,每个信号可以接受多个参数,如果需要,将结果返回给信号器。连接维护有很大的灵活性。

我使用Boost.Signals2(这是您已经提到的公认答案)。我在三四年前第一次学习Boost库时就开始使用它,它被证明是简单、灵活、优雅和可靠的;我没有理由去寻找另一个解决方案

我已经有一段时间没有使用Swing了,所以我无法对它进行深入的评论。使用Signals2,您仍然可以“创建”一个“侦听器类”(通过定义一个信号类型;侦听器是结果插槽类型);然后通过
connect()
方法将侦听器“注册”到给定的信号实例


对于信号2,每个信号可以接受多个参数,如果需要,将结果返回给信号器。连接维护有很大的灵活性。

谢谢,boost::signals2也是我找到的最好的解决方案之一。谢谢,boost::signals2也是我找到的最好的解决方案之一。