2015-11-12 1 views
-1

Java и C# отличаются в своих методах обработки событий. В Java вы пишете интерфейсы или классы, которые может вызывать ваша программа. В C# это делается по-разному с помощью событий и делегатов.Исходя из Java, C#, если у 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 
} 

ли это смысл? Я честно не вижу, как можно программировать что-либо без системы прослушивания/обработчика событий, я полагаю, что я близок.

Как вы имели дело с событиями, пришедшими с другого языка?

+0

Посмотрите на шаблоны проектирования. –

+0

Это зависит от вашего определения «иметь правильную обработку событий». – juanchopanza

+1

C++ как язык вообще не имеет представления о событиях. – SergeyA

ответ

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

Я думаю, что основное отличие заключается в том, что java использует шаблон в своей стандартной библиотеке, тогда как C++ не делает (возможно, потому что у него нет никаких классов gui). Но, например, Qt's Signal-Slot-концепция в основном именно такова. – MikeMB

+0

@MikeMB Я думаю, что механизм Qs с сигнальным слотом сильно отличается, поскольку obejct, который испускает сигнал, не должен ничего знать о объектах, которые его получают – user463035818

+0

Насколько я знаю, это происходит - после moc процесс, он имеет список объектов, которые связаны с определенным сигналом. Но я должен признать, что я не знаком с деталями реализации. – MikeMB

Смежные вопросы