2015-06-02 58 views
0

我來自Java/C#背景,並且是C++新手。我正在編寫一個庫,並試圖完成Handler在Java中執行的相同功能。我的方案如下:C++ Java處理程序equivilent

我正在構建一個用戶將放入他的移動/桌面應用程序的WinRT庫。在某些時候,在一些網絡通信發生後,一段數據會進入我想傳遞給用戶的數據。在Java中,我聲明瞭一個用戶可以初始化的公共靜態處理程序(但不對其進行初始化)。當數據進入時,我通過Handler發送一條消息,並且應用程序中的最終用戶聲明被調用,接收消息並從中獲取數據。

我似乎無法找到一種方法在C++中做同樣的事情。我查看了關於委託/函數指針的各種帖子/文檔,利用強大的谷歌和「回調」,「處理程序」和「委託」等關鍵字。我認爲我對C++有着不同的理解,但沒有任何結果。

任何人都可以友好地指出我在正確的方向嗎?

回答

0

與您在Java中所做的幾乎相同。在您的庫中,定義處理程序的純虛擬類(與Java interface或多或少類似)。

class somethinghandler 
{ 
public: 
    virtual void somethinghappened(<stuff that happened>) = 0; 
} 

並定義並實現一個類來監視事件並調用處理程序中定義的函數。此類包含客戶端安裝的指針或指針列表,以及添加和刪除客戶端的方法。如果可能的話,根本不要使用指針讓something做所有的包含。這樣的生活更清潔。如果你不能,使用shared_ptr守護指針,這樣它們在被從監視器中移除之前不會輕易被銷燬。

class somethingwatcher 
{ 
public: 
    bool addClient(std::shared_ptr<somethinghandler> clientToAdd); 
    bool removeClient(std::shared_ptr<somethinghandler> clientToRemove); 
    void applogic(); 

private: 
    std::shared_ptr<somethinghandler> client; 
    // or std::vector<std::shared_ptr<somethinghandler>> clients; 
} 

最後,在somethingwatcher的應用程序邏輯的某個地方,您檢測到發生的事情並調用客戶端。

void somethingwatcher::applogic() 
{ 
    // do stuff 
    if(<something happened>) 
    { 
     // or iterate through the list of clients and doing for each: 
     if (client != nullptr) 
     { 
      client->somethinghappened(<stuff that happened>); 
     } 
    } 
} 

庫並不需要了解其他客戶端任何比它存在並實現在somethinghandler定義的somethinghappened功能。只要你有一個有效的指針,魔術就會發生。那麼,不是真的,但這不是正確的地方去進入這個「魔法」的作品。

在客戶端的土地外庫...

客戶端代碼定義和實現,實現somethinghandler接聽電話到somethinghappened類。

class somethingclient: public somethinghandler 
{ 
public: 
    void somethinghappened(<stuff that happened>); 
    \\ handles something happening. 
} 

假設客戶端代碼實例化了一個名爲watcher的thingwatcher,那麼初始化例程創建並添加一個somethingclient給watcher。

std::shared_ptr<somethinghandler> handler = std::make_shared<somethingclient>(constructor arguments); 
watcher.addClient(handler); 
+0

謝謝!雖然我有點困惑。在實現我的庫的應用程序之間的關係,並希望通過此回調系統從它接收信息和庫本身,「客戶端」在您的示例中代表?我假設它是消費圖書館的應用程序 - 這就是定義了「發生的事情」的地方 - 然而,由於圖書館首先被寫入,因此圖書館不會提前知道該聲明,因此如何知道調用方法命名爲「somethinghappened」? – Droidmon2

+0

@ Droidmon2重新排序,並希望更好地解釋。也看看函子和lambda表達式。 – user4581301

+0

太棒了!這對我來說更有意義。再次感謝。 – Droidmon2