来自Java,C#,如果C ++没有事件处理,当事情发生时如何捕获?

时间:2015-11-12 14:45:12

标签: java c# c++ events listeners

Java和C#各自的事件处理技术不同。在Java中,您可以编写程序可以调用的接口或类。在C#中,使用事件和委托以不同方式完成。

C ++是否有某种形式的事件处理?

我的理解是Java事件是这样完成的:

class Class1
{
     private ArrayList<MyEventListener> listeners;

     //Class stuff

     public void doEvent () {for(MyEventListener e : listeners) {e.eventHappened(args);}

     public void addToListeners(MyEventListener eventListener) {listeners.add(eventListener);
     public void removeFromListeners(MyEventListener eventListener) {listeners.add(eventListener);
     public interface MyEventListener
     {
          void eventHappend (Anything passable);
     } 
}

我想C ++可以类似地完成

Define new Class
{
    Define Array (Java ArrayList/List) of the abstract class or interface below

    //Define other unrelated class stuff

    Define add to listeners function

    Define remove from listeners function

    Define inner interface (maybe a C++ abstract class would work instead as interfaces don't exist in C++) to act as event

           Define function in inner abstract event class to be the actual part of the code that represents the event

    Define call all listeners function
}

这有意义吗?老实说,如果没有事件监听器/处理程序系统,我怎么能看不出任何东西呢?我认为我很接近。

你是如何处理来自其他语言的事件的?

1 个答案:

答案 0 :(得分:3)

C ++就像Java没有内置的事件机制一样。它只是一种设计模式,您也可以在许多其他语言中实现。 Java事件机制的直接翻译可能如下所示:

class Class1 {
private:
     std::vector<MyEventListener*> listeners;

public:
    void doEvent () {
        for(MyEventListener* e : listeners) {e->eventHappened(args);
    }
    void addToListeners(MyEventListener* eventListener){
        listeners.push_back(eventListener);
    }
    void removeFromListeners(MyEventListener* eventListener){
        listeners.push_back(eventListener);  // same bug as in your java version :P
    class MyEventListener {
        virtual void eventHappend (Anything passable) = 0;
        virtual ~MyEventListener(){}
    }; 
};