【问题标题】:Observer pattern in c++/cli for mixed managed/unmanagedc++/cli 中的观察者模式,用于混合托管/非托管
【发布时间】:2013-04-03 05:01:47
【问题描述】:

我有一个由 C# UI、C++/CLI 混合模式互操作包装器和一些原生 c++ 项目组成的系统。

我需要做的是建立一个系统,让原生 c++ 代码可以发送日志消息,并且 UI 可以报告它。

我使用this 作为模板设置了本机 IObservable,但是 C# 代码不能成为观察者。我的想法是在 C++/CLI 中设置另一个观察者模式,它观察本地观察者,并让 C# 实现它。我使用this 作为模板,但我正在努力将其转换为有效的 C++/CLI。

ref class Observable
{
public:
Observable(void);
virtual ~Observable(void);

event System::EventHandler^ SomethingHappened;

void DoSomething() {
    System::EventHandler^ handler = SomethingHappened;
    //if (handler != nullptr)
    //{
        handler(this, System::EventArgs::Empty);
    //}//null check not permitted in C++/CLI
};

给出错误:C3918:需要SomethingHappened 是数据成员。 This is the MSDN page - 但我无法确定我做错了什么。

有什么建议吗?

谢谢, 梅兰妮

【问题讨论】:

    标签: c++-cli observer-pattern mixed-mode


    【解决方案1】:

    您正在尝试使用 C# 语法。事件在 C++/CLI 中的工作方式略有不同,除了添加和删除访问器之外,它们还有一个 raise 访问器。换句话说,触发事件的方法。如果您不提供显式版本,编译器会自动生成一个。这使得引发事件变得非常简单:

    void DoSomething() {
        SomethingHappened(this, System::EventArgs::Empty);
    }
    

    【讨论】:

      【解决方案2】:

      在 C++/Cli 中,使用“琐碎事件”时,您不需要检查事件是否为 null(而且您也不能)。语言会为您解决这个问题。

      查看相关: Error C3918: Error wile checking event for being nullptr Does C++/CLI event have any listeners?

      因此,对于您的情况,只需删除 nullptr 检查

      【讨论】:

      • 谢谢,这些都是有用的链接 - 但是当我删除空检查时,我得到了同样的错误。
      【解决方案3】:

      使用this,正确的做法是直接触发事件。像这样:

      void DoSomething() {       
          SomethingHappened(this, System::EventArgs::Empty);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-12-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多