【问题标题】:Coming from Java, C#, if C++ has no event handling, how does one catch when something happens?来自 Java、C#,如果 C++ 没有事件处理,当有事情发生时如何捕捉?
【发布时间】:2016-02-13 22:25:38
【问题描述】:

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
}

这有意义吗?老实说,如果没有事件侦听器/处理程序系统,我无法看到如何编程任何东西,我想我已经接近了。

您如何处理来自另一种语言的事件?

【问题讨论】:

  • 研究设计模式。
  • 这取决于你对“有一些适当的事件处理”的定义。
  • C++ 作为一门语言根本不知道事件。
  • 如果我没有完全错的话,Java作为一门语言也不知道事件,它只是实现东西的主流方式。
  • 我会将其表述为一个答案,然后上/下投票者会判断它是否是一个好的答案;)

标签: java c# c++ events listeners


【解决方案1】:

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(){}
    }; 
};

【讨论】:

  • 我认为主要区别在于 java 在其标准库中使用该模式,而 c++ 没有(可能是因为它没有任何 gui 类)。但是例如Qt 的 Signal-Slot-concept 基本上就是这样。
  • @MikeMB 我认为详细Qts的信号槽机制是完全不同的,因为发出信号的对象不需要知道接收它的对象的任何信息
  • 据我所知,确实如此 - 在 moc 进程之后,它有一个连接到特定信号的对象列表。但我不得不承认,我对实现细节并不熟悉。
  • 谢谢。我对 C++ 并不陌生,但已经有几年了。这正是我所指的。您的编辑版本甚至比原版更好!
猜你喜欢
  • 2018-10-13
  • 1970-01-01
  • 1970-01-01
  • 2012-10-07
  • 1970-01-01
  • 1970-01-01
  • 2011-12-29
  • 1970-01-01
相关资源
最近更新 更多