【问题标题】:what is the C++/CLI syntax to subscribe for events?订阅事件的 C++/CLI 语法是什么?
【发布时间】:2009-01-28 22:09:33
【问题描述】:

我正在更新一些旧的托管 C++ 代码,如下所示:

instanceOfEventSource->add_OnMyEvent( 
    new EventSource::MyEventHandlerDelegate(this, MyEventHandlerMethod) );

在哪里

  • EventSource 是发布事件的类
  • instanceOfEventSource 是该类的一个实例
  • EventSource::MyEventHandlerDelegate 是事件的委托类型
  • MyEventHandlerMethod 是当前类(其中“this”是一个实例)中的(非静态)方法,其签名匹配 EventSource::MyEventHandlerDelegate

在 C++/CLI 中正确的语法是什么?

【问题讨论】:

    标签: c++-cli managed-c++


    【解决方案1】:

    语法类似于 C#,换句话说,+= 被重载以使这成为可能:

    instanceOfEventSource.MyEvent +=
        gcnew EventSource::MyEventHandlerDelegate(this, &MyClass::MyEventHandlerMethod);
    

    类似地用于删除。然而,与 C# 不同的是,您不能省略事件处理程序委托的显式实例化,因此这会产生相当冗长的代码。

    【讨论】:

    • 你不应该使用gcnew吗?
    • 我必须使用 gcnew,而且我还发现我必须编写“@MyClass::MyEventHandlerMethod”而不仅仅是“MyEventHandlerMethod”。但这把我带到了我需要去的地方——谢谢!!
    • 关于gcnew,我只是没有更改这部分代码。关于方法也是正确的。 :-/
    【解决方案2】:

    我刚刚花了半个小时试图弄清楚如何将静态方法注册为事件的回调方法。虽然 OP 没有特别要求注册静态方法,但这将有助于其他面临同样问题的人。它实际上非常简单,在这种情况下,委托构造函数只需要一个静态目标方法的参数。

    例子:

    System::EventHandler^ h = gcnew System::EventHandler(&MyClass::MyStaticCallbackMethod);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-01
      • 1970-01-01
      • 2019-04-24
      • 1970-01-01
      相关资源
      最近更新 更多