来自Java,C#,如果C++没有事件处理,那么当发生某些事情时如何捕获
Coming from Java, C#, if C++ has no event handling, how does one catch when something happens?
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
}
这有意义吗?老实说,我看不出没有事件侦听器/处理程序系统如何编程任何东西,我想我已经很接近了。
你如何处理来自另一种语言的事件?
就像
Java没有内置的事件机制一样C++。它只是一种设计模式,您也可以在许多其他语言中实现。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(){}
};
};
相关文章:
- C++ 一个lambda浅拷贝const Type&如果它被赋予一个命名捕获,如[copy=val](){}?
- 如果 std::function 捕获了unique_ptr,如何复制它?
- 是否可以将带有捕获和参数的 lambda 传递给另一个函数?如果是这样,如何?
- F.54:如果捕获此变量,请显式捕获所有变量(无默认捕获)
- 如果在生成 std::thread 后引发,则未捕获异常
- 如果我对"while"块发表评论,为什么程序会死机?其中的"yield"线有何影响?
- 如果唯一指针是捕获的值,为什么它不能在 lambda 内移动?
- C++程序在第一次尝试时会给出垃圾,但如果它捕获异常并重试,则会给出适当的值
- 如果函数抛出的异常可能未捕获,如何销毁局部变量?
- C 是否具有接口类概念,如果它在那里,那么它与Java接口类别有何不同
- 如果存储原始参考的类不在范围之外,可以捕获会员参考安全吗?
- 如果我使用 std::function 来捕获 lambda,我应该担心它被解除分配吗?
- 如果"foo"是引用变量,[&foo]{ ... } 捕获和 [foo]{ ... } 捕获之间有区别吗?
- 如果文件在构造函数中不存在,则抛出异常,并在 main() 中创建对象时尝试/捕获它,如果好 - 开始使用该对象
- 如果捕获常规异常,异常是否有可能冒泡
- C++ 如果文件被删除,则捕获
- C++lambda:如果引用被值捕获,如何避免对其进行切片
- 外壳扩展DLL-如果用户在文件夹空白区域内单击,如何捕获文件夹路径
- 来自Java,C#,如果C++没有事件处理,那么当发生某些事情时如何捕获
- 如果通过引用捕获异常,可以修改它并重新抛出吗?