簡體   English   中英

C ++類設計建議

[英]C++ Class Design Advice

我有一個Node類模板,它以Data類型作為模板參數:

template <class T_Data>
class Node
{
};

Node類能夠在某些事件上通知用戶/偵聽器。 此功能是使用libsigc++信號實現的,但是在發出信號之前,Node會通知處理程序對象,該對象將進行一些處理並決定是否發出信號。 存在該處理程序對象是因為在某些情況下,我希望節點對象處理其事件,從而阻止信號。

常見的解決方案是提供任何人都可以在派生類中重寫的Node虛擬方法,但是由於Node使用對自身的引用並創建其自己類型的對象,因此擁有HandlerBase類並讓人們派生處理程序變得更加容易。

一切順利,直到編寫了處理程序類,並且我希望節點使用它。 但是為了啟用新的處理程序,我需要調用靜態Node方法Node::set_event_handler() 這意味着我必須記住在某個地方調用它。 如果有人想使用我的處理程序,則必須記住要在main()或某些主類的ctor中設置處理程序,也許是在GUI應用程序中設置其Window類。

template <class T_Data>
class Node
{
public:
     static void set_event_handler (std::unique_ptr <HandlerBase> new_handler);
private:
     static std::unique_ptr <HandlerBase> event_handler;
};

因此,我提出了兩種可能的解決方案:

  1. 把調用set_handler()在我有的一些主類中
  2. 將T_Handler模​​板參數添加到Node類

當前,靜態處理程序字段設置為新的HanderBase,它會忽略所有信號。 如果使用template參數,則可以使用不同的處理程序來具有相同的數據類型,並且將在初始化中設置靜態字段,因此無需進行任何額外的工作。

問題是,T_Handler是否只是在節點上添加了一個模板參數,而不僅僅是許多用戶甚至不需要的參數,T_Handler是否不僅在節點上添加了“混亂”的外觀,還使它變得“干凈”了。

實際上,我也可以給T_Handler一個默認值,這樣用戶就可以不用它了,因為他們不需要它,但是我仍然很好奇哪種設計可能更好。

當然,它會增加混亂並使其不干凈。 但是,這真的是一個大問題嗎? 我想這取決於您的觀點。

如果您查看標准庫中的許多模板,則會看到大多數用戶不需要的模板參數。 默認值和typedef用於隱藏此混亂情況。 例如,請參見std :: basic_string ,其中:

  • 大多數用戶並不關心traitsAlloc ,因此這些參數有默認值
  • charT一個流行值就是char ,因此std :: string類型定義為簡寫形式。

請注意,此雜波只是隱藏的。 如果您需要調試代碼,並且正在調試器中查看變量的類型,它將很傷您。 ;)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM