2011-01-31 56 views
1

我是爲學習目的在C++中編寫UDP客戶端/服務器協議,其中使用處理程序實現了從我的應用程序的服務器組件到應用程序其餘部分的通信。當創建一個「Handler Registration」類型的體系結構時,我應該如何傳遞處理程序?

例如,我可能會針對值1註冊Authorization組件,然後針對值爲2註冊一個TextMessage組件。然後,客戶端首先向Authorization組件發送一個或兩個消息以登錄,然後開始向TextMessage發送文本消息處理程序。

這是我現在有:

class NetworkHandler { 
    virtual void handleMessage(const endpoint & endpoint, const buffer & message) = 0; 
}; 

那些希望註冊爲成分簡單地繼承NetworkHandler並調用

udpServer.addHandler(handler); 

不過,我在與確定的幾個問題的任何類我應該怎樣通過處理程序,成爲新手和所有人。

我應該通過引用傳遞處理程序嗎?這很簡單方便,但是所有權問題就起作用了 - 調用函數應該不必擔心無緣無故地繼續引用。

我應該複製處理程序嗎?這也很容易和方便,但是這裏有一個問題:我的處理程序是否可以複製,或者是否需要從課堂外引用我的處理程序。

我想知道的是,這種情況的常見最佳做法是什麼?對不起,牆上的文字。

回答

0

如有疑問,請與shared_ptr分享。這是自我記錄並且幾乎總是有效的,代價是一些指針間接和一個/兩個內存分配。

0

您有幾個選項。

  • 無論誰分配,刪除。傳入指針/引用,分離時返回指針/引用。
  • 服務器所有權。將指針傳遞給分配的實例,服務器負責在分離時刪除。
  • 智能指針(如提升shared_ptr或其他)。只要有人蔘考,你就不用擔心內存管理(大部分)。

我最近完成了這樣一個系統,並使用了智能指針,因爲它證明是最簡單的,不需要額外的文檔。

0

換句話說,問題是服務器組件是擁有應用程序組件還是其他方式,是嗎?

在思考它的過程中,應用程序邏輯層位於網絡傳輸層之上。網絡層是一種較低級別的機制,它不具備應用程序邏輯的知識,並且可以用它來構建具有不同應用程序邏輯的多個應用程序,因此創建和擁有應用程序層將是不方便的。另一方面,應用層知道實現所需邏輯需要哪些組件。因此,它可以創建並擁有網絡層。

如果您想要乾淨地分離圖層,或者如果應用程序層和網絡層的生存期之間不匹配,那麼創建兩個組件(對象)並通過它們綁定在一起的代碼是有意義的接口和這段代碼都可以擁有。通常,這段代碼是main()函數,它讀取命令行/ config文件,創建並配置所需的對象,將它們綁定在一起並驅動事件循環(select/epoll/...)。通過這種方式,您不需要關注具有所有權問題的回調接口,並將它們與智能指針混雜在一起,只需通過回調將指針或引用傳遞給接口即可。只要確保不要在構造函數或析構函數中調用長壽命對象的回調函數,以便您可以按照最方便的順序構建和拆除調用圖。

相關問題