English 中文(简体)
C++ 中的事件
原标题:
  • 时间:2008-10-26 22:46:33
  •  标签:

我不确定怎样在网上寻找这个...我想它们在C++中可能有不同的称呼。

我想要一个简单的活动系统,类似于

event myCustomEvent;
myCustomEvent.subscribe( void myHandler(string) );
myCustomEvent.fire("a custom argument");
// myHandler prints out the string passed in the first argument


event myNewCustomEvent;
myNewCustomEvent.subscribe( void myNewHandler(int) );
myNewCustomEvent.fire(10);
// myHandler prints 10

我可以通过一个简单的类来很容易地实现这个 -- 但是当我想要有一个事件,将不同类型或数量的参数传递给订阅者时,我必须编写并定义一个全新的事件类。我想应该有一些库,甚至在Visual C++ 2008中可能有一些本地的东西,可以类似于这样工作。这基本上只是观察者模式的实现,所以在C++中应该不会太难做。

这真让我欣赏JavaScript的好处,不必担心传递的参数。

告诉我这是不是一个愚蠢的问题。

最佳回答

我使用sigslot正是为了这个目的。

问题回答

看看Boost信号库。 结合功能和绑定库,您可以完全做到您要找的。

GOF的观察者模式基本上就是你想要的。

在这本书中,它有这个的 C++ 代码...

另外,像往常一样,Boost还有你可以利用的东西。

这里有一个原生的Visual C++事件系统。它主要是面向COM的,但也有原生的C++支持。

这里:

[event_source(native)]
class CSource {
public:
   __event void MyEvent(int nValue);
};

[event_receiver(native)]
class CReceiver {
public:
   void MyHandler1(int nValue) {
      printf_s("MyHandler1 was called with value %d.
", nValue);
   }

   void MyHandler2(int nValue) {
      printf_s("MyHandler2 was called with value %d.
", nValue);
   }

   void hookEvent(CSource* pSource) {
      __hook(&CSource::MyEvent, pSource, &CReceiver::MyHandler1);
      __hook(&CSource::MyEvent, pSource, &CReceiver::MyHandler2);
   }

   void unhookEvent(CSource* pSource) {
      __unhook(&CSource::MyEvent, pSource, &CReceiver::MyHandler1);
      __unhook(&CSource::MyEvent, pSource, &CReceiver::MyHandler2);
   }
};

int main() {
   CSource source;
   CReceiver receiver;

   receiver.hookEvent(&source);
   __raise source.MyEvent(123);
   receiver.unhookEvent(&source);
}

我使用libsigc++。它是gtkmm的本地库。

一个简单的例子,松散地改编自教程

#include <iostream>
#include <sigc++/sigc++.h>

using namespace std;

class AlienDetector {
public:
        void run ();
        sigc::signal<void> signal_detected;
};

void warn_people () {
        cout << "There are aliens in the carpark!" << endl;
}

void AlienDetector::run () {
        signal_detected.emit ();
}

int main () {
        AlienDetector mydetector;
        mydetector.signal_detected.connect (sigc::ptr_fun (warn_people));
        mydetector.run ();
}

它还提供了一种机制,使用sigc::mem_fun而不是sigc::ptr_fun将特定对象的成员函数连接到信号。

sigc::mem_fun (someobject, &SomeClass::some_method);

这几乎提供了GLib信号可能的任何功能。





相关问题
热门标签