C++如何实现C#的事件机制
C++实现事件机制主要靠类的继承重写虚函数,映像比较深的MFC,以On开头的函数。
这样如果要实现类B监听类A的机制,就必须用类B继承类A,这种强制的继承让人很不爽。
C#的事件机制就比较好,类A发布事件,任何类都可以订阅,且没有强制的继承关系。
C++典型的重写虚函数事件机制:
1 //-------------------------------------------------
2 //
3 // c++ use extends class implement event.
4 //
5 //-------------------------------------------------
6 class TestA
7 {
8 public:
9 virtual void Print(){};
10 };
11
12 class TestB : public TestA
13 {
14 virtual void Print()
15 {
16 std::cout<< "TestB's Print listen TestA's Print.\n";
17 }
18 };
C++实现的C#的事件机制:
1 class PrintEventArgs: public EventArgs
2 {
3 public:
4 int a;
5 };
6
7 class TestAA
8 {
9 public:
10 EventHandler _print;
11 virtual void Print()
12 {
13 if(_print != 0)
14 {
15 PrintEventArgs e;
16 e.a = 10;
17 _print(this, &e);
18 std::cout<< "TestBB return value:"<<e.a<<"\n";
19 }
20 }
21 };
22
23 class TestBB
24 {
25 public:
26 void PrintListener(void * sender, PrintEventArgs * e)
27 {
28 std::cout<< "TestAA input value:"<<e->a<<"\n";
29 e->a = 100;
30 }
31 };
测试代码如下:
1 int main()
2 {
3 //test c++ event
4 TestA * lptest = (TestA *)new TestB();
5 lptest->Print();
6 //test c# event.
7 TestAA a;
8 TestBB b;//testbb 's method listen testaa's print event.
9 a._print +=(EventListener(&b,(EventMethod)&TestBB::PrintListener));
10 a.Print();
11 return 0;
12 }