2014-10-19 22 views
-1

我有一個事件處理程序,例如,原生C++ 11事件 - 事件沒事勢必會引發錯誤

__event void MouseMoved(int MousePosX, int MousePosY); 

,並通過

__raise MouseMoved(MousePosX, MousePosY); 

這個工程使用__hook後完全沒有上調給事件添加一個函數;然而,如果我提出即使綁定到事件的任何函數,我也會遇到運行時錯誤。在提升之前是否有辦法檢查事件是否爲空?

+0

本地C++ 11沒有__event。所以請標記並正確命名您的問題! – Klaus 2014-10-22 07:18:23

回答

0

我選擇只是定義我自己的事件對象,它包含可以按順序調用的函數指針列表。如果函數與C#中的事件和事件處理程序非常相似。

struct EventArg 
{ 
public: 
    EventArg(){} 
    ~EventArg(){} 

    static EventArg Empty() 
    { 
     EventArg empty; 
     return empty; 
    } 
}; 


template <typename T> 
class EventHandler 
{ 
public: 
    EventHandler(void(T::*functionHandle)(void*, EventArg), T* receiver) 
    { 
     this->functionHandle = functionHandle; 
     this->receiver = receiver; 
    } 

    virtual void Call(void* sender, EventArg e) 
    { 
     (receiver->*functionHandle)(sender, e); 
    } 

private: 
    void (T::*functionHandle)(void*, EventArg); 
    T* receiver; 
}; 

class Event 
{ 
private: 
    std::vector<EventHandlerBase*> EventHandlers; 
public: 
    void Raise(void* sender, EventArgT e) 
    { 
     for (auto item = EventHandlers.begin(); item != EventHandlers.end(); item++) 
      (*item)->Call(sender, e); 
    } 

    void Add(EventHandler* functionHandle) 
    { 
     EventHandlers.push_back(functionHandle); 
    } 

    void Remove(EventHandler* functionHandle) 
    { 
     for (auto item = EventHandlers.begin(); item != EventHandlers.end(); item++) 
     { 
      if ((*item) == functionHandle) 
      { 
       EventHandlers.erase(item); 
       return; 
      } 
     } 
    } 
} 
0

C++ '11沒有本地事件。 C++ '14也沒有。

這對我來說是什麼樣的功能是特定於Microsoft Visual C++ - 也許Microsoft's Unified Event Model?如果是這樣的話,舉一個沒有訂閱者的事件不應該導致錯誤根據他們的文檔:

要觸發一個事件,只需調用聲明爲事件源類中的事件的方法。如果處理程序被掛鉤,處理程序將被調用。

在另一方面,.NET需要您檢查事件撫養他們和你使用同樣在託管C++項目工作的這些關鍵字之前是空的,所以如果你創建了一個託管應用程序,它可以很好是你需要的,如果你想寫可以移植的C++,關於其他的編譯器和/或平臺的工作做類似的東西

if(MouseMoved != nullptr) { 
    __raise MouseMoved(MousePosX, MousePosY); 
} 

,我可以推薦libsigc++JL Signal

+0

選中此:http://msdn.microsoft.com/en-us/library/ee2k0a7d.aspx – 2014-10-19 22:05:48

+0

這是我鏈接到Microsoft Visual C++特定編譯器擴展的非常文章。關於空檢查,它編譯並在Visual C++ 2013 Express上運行:http://pastebin.com/KxStV0yy – Cygon 2014-10-19 22:09:02