與您在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);
謝謝!雖然我有點困惑。在實現我的庫的應用程序之間的關係,並希望通過此回調系統從它接收信息和庫本身,「客戶端」在您的示例中代表?我假設它是消費圖書館的應用程序 - 這就是定義了「發生的事情」的地方 - 然而,由於圖書館首先被寫入,因此圖書館不會提前知道該聲明,因此如何知道調用方法命名爲「somethinghappened」? – Droidmon2
@ Droidmon2重新排序,並希望更好地解釋。也看看函子和lambda表達式。 – user4581301
太棒了!這對我來說更有意義。再次感謝。 – Droidmon2