2011-09-01 79 views
1

我有一个A类,它实现一个接口ICLI/C++虚拟事件处理器

在界面I是声明:

virtual event System::EventHandler ^eh; 

在AI的头文件中由similare声明实现此:

virtual event System::EventHandler ^eh; 
在AI的cpp文件

希望该事件的委托分配给anotheter变量:

EventHandler ^eh2 = eh; 

这给了错误

Error 285 error C3918: usage requires 'eh' to be a data

我也尝试

EventHandler^ eh2 = gcnew System::EventHandler(eh); 

这给了错误:

Error 285 error C3924: error in argument #1 of delegate constructor call 'System::EventHandler':

+0

你可以发布你的整个接口和实现类声明,以及你得到编译错误的整个函数吗?除此之外,你读过这个吗? http://msdn.microsoft.com/en-us/library/w901cc8a%28v=VS.100%29.aspx –

+0

从接口的事件定义中删除虚拟机时会发生什么?只有实现类应该将事件定义为虚拟的,而不是接口本身。 –

+0

@Roger:有点不相关,但界面没有定义,它只是声明 –

回答

4

事件关键字明确禁止访问这样的事件。唯一有效的操作是添加一个处理程序(+ =运算符),删除一个( - =运算符)并引发事件。如果你想访问底层的委托对象,那么你必须提供添加和删除访问器来包装委托对象,而不是使用编译器生成的默认访问器。就像这样:

public interface class IFoo { 
    event EventHandler^ eh; 
}; 

ref class Bar : IFoo { 
private: 
    EventHandler^ dlg; 
public: 
    event EventHandler^ eh { 
     virtual void add(EventHandler^ handler) { dlg += handler; } 
     virtual void remove(EventHandler^ handler) { dlg -= handler; } 
    }; 
public: 
    void test() { 
     EventHandler^ copy = dlg; 
     // etc.., fire for example 
     copy(this, EventArgs::Empty); 
    } 
}; 

一定要考虑,如果这真的是你想要做什么,这是相当不可能是正确的。

+0

我不认为这是问题的答案。我的示例将编译,如果不是虚拟的 – Ravi