2011-09-01 80 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