調試C++NPv2_TP_Reactor_Log_Server程序

       main函數中定義ACE_TP_Reactor tp_reactor;變量,定義在ace\TP_Reactor.h文件中的類ACE_TP_Reactor繼承ACE_Select_Reactor類,例子C++NPv2_Select_Reactor_Log_Server的main函數中定義了ACE_Select_Reactor select_reactor;變量,類ACE_Select_Reactor則是在ace\Select_Reactor.h文件中定義:typedef ACE_Select_Reactor_T<ACE_Reactor_Token_T<ACE_Token>> ACE_Select_Reactor;,其中ace\Select_Reactor_T.h文件中定義了模板類ACE_Select_Reactor_T;ace\Reactor_Token_T.h文件中定義了模板類ACE_Reactor_Token_T,ace\Token.h文件中定義了類ACE_Token。react

       調試C++NPv2_TP_Reactor_Log_Server例子,ace\OS_main.h文件中的宏擴展了main函數,其中定義了繼承自ACE_Main_Base類的ACE_Main類,main函數中定義ACE_Main m;變量,ACE_Main_Base的構造函數中調用ACE::init函數,該函數中調用ACE_Object_Manager::instance來構造ACE_Object_Manager對象,ACE_Object_Manager類構造函數中調用其成員函數init,在該函數中調用ACE_Atomic_Op<ACE_Thread_Mutex, long>::init_functions函數,在ACE_Atomic_Op<ACE_Thread_Mutex, long>::init_functions函數中,對其靜態成員變量increment_fn_賦值,這些變量爲函數指針,由於這些變量是靜態變量,在實現文件中先會對其賦值,對函數指針賦值能夠直接將一個函數名取地址賦值給函數指針,可是這裏是直接將函數名做爲值賦值給函數指針的解引用,實際上是同樣的。函數

       VS2013實現發現對一個函數指針變量,將一個函數名取地址後賦值給該變量,或者直接將該函數名賦值給該指針變量,經過對該指針解引用調用均可以正常執行,效果同樣。測試發現對函數指針解引用調用或者直接將函數指針做爲函數名調用,結果是同樣的。測試

       關於類的成員函數指針類型,若是對一個函數指針賦值,必須對這個非靜態函數加上&,即取地址符。不然會覺得是調用該函數,報錯說"XXX函數調用缺乏參數列表,用&XXX建立一個成員指針"。可是若是該函數是一個類的靜態函數,則須要一個通常函數的指針來指向,就不須要加上取地址符&了。這個主要是調用博客園上的文章<通常函數指針和類的成員函數指針>的第二部分指向類的成員函數的指針發現的:類的靜態成員函數採用與通常函數指針相同的調用方式。spa

       關於類成員函數指針的調用:->*和.*。在文章<通常函數指針和類的成員函數指針>中,用的是->*操做符,這樣的方式在ACE的例子中也能夠看到,ace\Event_Handler_T.h文件中定義了模板類ACE_Event_Handler_T,該模板類中定義了類成員函數指針類型GET_HANDLE、SET_HANDLE、IO_HANDLER等,一樣以這些函數指針類型定義了成員變量,以及模板類型的指針T *op_handler_;。在examples\Reactor\Misc\test_event_handler_t.cpp文件中進行測試,該文件中定義了ACE_Test_Sig_Handler類做爲模板類ACE_Event_Handler_T的模板實參,並將模板實參類ACE_Test_Sig_Handler的成員做爲參數來定義ACE_Event_Handler_T模板類的對象,即賦值給ACE_Event_Handler_T模板類中定義的類成員函數指針,而後又因爲該模板類中定義了模板實參指針T *op_handler_;(//Pointer to the object that handles all the delegated operations),因此在調用時用->*操做符,具體見ace\Event_Handler_T.cpp文件中的ACE_Event_Handler_T<T>::get_handle等模板函數。->*的左側是一個類對象的指針,而->*的右側則是一個類成員函數指針的對象,是一個變量,這個變量即成員函數指針對象指向一個類的成員函數指針。關於類成員函數指針.*參看ace\Select_Reactor_Base.cpp文件,在該文件的ACE_Select_Reactor_Impl::bit_ops函數中,首先定義了類成員函數指針ACE_FDS_PTMF ptmf  = &ACE_Handle_Set::set_bit;,在後面經過一個類對象,而非類對象指針來調用時就用.*操做符。指針

       網上搜到一篇文章<typedef定義函數類型>,該文章中用typedef分別自定義函數指針類型及自定義函數類型。區別就是當自定義函數類型時,須要像內置類型那樣定義一個指針來指向某一函數。在第一個例子中,即tpyedef自定義函數指針類型,定義了一個指針類型,而後用該類型建立一個變量,即指針變量,可是該例子中對指針變量賦值的時候並無用函數名取地址,而是直接用函數名來賦值,後來測試用函數名取地址也能夠賦值給函數指針變量,而後函數指針變量能夠解引用調用也能夠直接調用,結果都同樣。調試

       關於用typedef對一個類的成員函數指針類型的聲明,與普通成員函數指針類型聲明相似,只不過在類型前加上"類名::",對於一個類的靜態函數,能夠將其取地址後賦值給一個普通的函數指針。這個能夠在ACE_Object_Manager::init函數中看到,當調用完ACE_Atomic_Op<ACE_Thread_Mutex, long>::init_functions ()函數後,會以&ACE_Service_Config::handle_signal做爲參數構造ACE_Sig_Adapter類對象,handle_signal函數爲ACE_Service_Config類的靜態函數,而ACE_Sig_Adapter類的構造函數中對應該靜態函數的類型ACE_Sig_Handler_Ex則爲普通的函數指針類型。對象

       不理解main函數中auto_ptr<ACE_Reactor> delete_instance變量定義的意義。繼承

相關文章
相關標籤/搜索