最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

C++委托

2022-11-28 13:13 作者:有個小小杜  | 我要投稿

委托在開發(fā)過程中的重要性

????????在游戲開發(fā)過程中,委托是一個必不可少東西,它可以動態(tài)綁定和解綁函數(shù),可以使我們在開發(fā)過程中不必要過多的關(guān)注我們需要調(diào)用的對象,只需要關(guān)注調(diào)用的時刻,在SDL或者Win32開發(fā)中,其中窗體應(yīng)用程序基本會使用循環(huán)來處理消息通知,而在消息通知中我們在獲取到通知之后,該做什么事這個部分,就可以充分的利用委托來幫我們做。

例如:

????????這種方式是沒有委托的方式,十分不不友好,因為在窗體處理消息時,需要獲取實例A,B,C的指針,來通過鼠標(biāo)左鍵點擊來處理A,B,C的邏輯,這使得我們每次在添加一個物體的鼠標(biāo)邏輯時,都需要修改一次消息處理的代碼。

????????當(dāng)有了委托之后,消息處理函數(shù)不必關(guān)心調(diào)用的是什么邏輯,就通過委托(Delegate)廣播需要實現(xiàn)左鍵點擊操作的函數(shù),當(dāng)我們要添加一個物體進(jìn)行左鍵點擊操作時,只需要將物體的函數(shù)綁定到委托上,就需要修改消息處理的邏輯。

委托的實現(xiàn)原理以及實現(xiàn)

????????在虛幻游戲引擎提供的功能中,有一項就是委托,我們可以方便的使用委托這個功能開發(fā)各種邏輯,但是原生C++是沒有委托的,如果我們使用原生C++開發(fā)程序時,自己造一個委托的輪子,在以后開發(fā)C++程序的過程中都可以用上。

????????委托的本質(zhì)就是一個結(jié)構(gòu)體或一個類,里面封裝了一些功能比如Bind(),UnBind(),包括重載了()運(yùn)算符,等功能,類中的成員變量其中就有指向函數(shù)的指針,通過函數(shù)指針來調(diào)用我們綁定的函數(shù),如果是多播委托(一個委托可以綁定多個函數(shù)),里面會有函數(shù)指針的表,遍歷表里所有的函數(shù)指針來達(dá)到一次性調(diào)用多個函數(shù)的目的。

????????再來,我們委托綁定的函數(shù)可以為不同參數(shù),也可能為不同的返回值,在這里我們就需要用C++模板的知識了,我們定義一個委托類模板,通過不同模板參數(shù)來實例化不同的模板類,按照這個思路,我們開始來實現(xiàn)吧。

  • 先定義一個委托實現(xiàn)的接口:

????????定義一個接口IDelegate模板,綁定的函數(shù)有返回值和有傳入?yún)?shù),所以定義模板參數(shù)ReturnT為返回值類型,...ArgsT為傳入?yún)?shù)類型。將operator()定義為純虛函數(shù),繼承這個接口的類必須實現(xiàn)operator()函數(shù),實現(xiàn)Delegate的多態(tài),因為委托可能會綁定類成員函數(shù),也可能會綁定非類成員函數(shù)。

  • 繼承接口定義實現(xiàn)委托的類:

????????繼承IDelegate來定義類成員函數(shù)委托模板DynamicDelegate,要調(diào)用一個類成員函數(shù),必須得有類的實例,類成員函數(shù)的指針,模板參數(shù)多了一個ClassT,ClassT為類成員函數(shù)所屬于的類的類型。DynamicDelegate的成員變量為類實例的指針,類成員函數(shù)的函數(shù)指針,通過實現(xiàn)IDelegate接口的operator()函數(shù),來調(diào)用類的成員函數(shù)。

????????繼承IDelegate來定義非類成員函數(shù)委托模板StaticDelegate,StaticDelegate的成員變量為非類成員函數(shù)的函數(shù)指針,通過實現(xiàn)IDelegate接口的operator()函數(shù),來調(diào)用類的成員函數(shù)。

  • 實現(xiàn)單播委托:

????????定義單播委托模板,單播委托(一個委托只能綁定一個函數(shù)),成員變量為一個IDelegate指針(我選擇了用智能指針unique_ptr指向IDelegate實例,這是垃圾回收相關(guān)的問題,這里不展開討論)。IDelegate指針可以指向DynamicDelegate 和StaticDelegate 這兩個委托類,不用關(guān)心指針指向的是類成員函數(shù)委托還是非類成員函數(shù)委托,因為IDelegate::operator()是虛函數(shù)。Bind()和Clear()實現(xiàn)了綁定函數(shù)和解綁函數(shù)的操作,Bind()函數(shù)重載了兩個版本,一個用于綁定類成員函數(shù),一個用于綁定非類成員函數(shù),Invoke()用來執(zhí)行委托的單播,作用和operarot()一樣。(函數(shù)具體實現(xiàn)在文末尾的鏈接里)

  • 實現(xiàn)多播委托:

????????定義多播委托模板,多播委托(一個委托綁定多個函數(shù)),和單播委托不一樣的地方就是,多播委托綁定多個函數(shù)時需要多個IDelegate指針,我們就用C++標(biāo)準(zhǔn)庫的容器vector來存儲這多個IDelegate指針。AddFunc()和RemoveFunc()實現(xiàn)了添加函數(shù)綁定和移除函數(shù)綁定的操作,并針對類成員函數(shù)和非類成員函數(shù)重載了兩個版本,Clear()實現(xiàn)了對所有函數(shù)綁定的清空,BroadCast()負(fù)責(zé)遍歷IDelegate指針依次調(diào)用綁定的函數(shù),作用和operator()一樣。(函數(shù)具體實現(xiàn)在文末尾的鏈接里)

  • 添加宏定義:

????????用過虛幻引擎的小伙伴們應(yīng)該都知道,虛幻引擎無論是單播,多播,還是動態(tài)委托基本都是通過宏來聲明的,我添加這個宏定義也是為了讓我更方便的定義一個委托。

DECLARE_FUNCTION_DELEGATE(委托名,返回值,參數(shù)...)來定義單播委托。

DECLARE_FUNCTION_MULTICAST_DELEGATE(委托名,參數(shù)...)來定義多播委托。

測試結(jié)果

????????通過DECLARE_FUNCTION_MULTICAST_DELEGATE(FAddDelegate, int, int)定義了多播委托FAddDelegate,聲明一個多播委托OnAdd,綁定對象a函數(shù),對象b的函數(shù),和全局函數(shù),執(zhí)行多播,結(jié)果如下:


C++委托運(yùn)行結(jié)果

既然原生C++沒有委托,那我們就試著造一個輪子吧。

C++委托源代碼鏈接:https://github.com/YGXXD/Cpp-Delegate

C++委托的評論 (共 條)

分享到微博請遵守國家法律
新乐市| 本溪| 普安县| 铜鼓县| 云阳县| 武功县| 鄯善县| 高阳县| 屏东市| 湘西| 岑巩县| 陆河县| 宝坻区| 林州市| 象山县| 宜丰县| 小金县| 梁山县| 长子县| 南郑县| 龙州县| 安达市| 建德市| 遂川县| 忻城县| 灵璧县| 肥西县| 东丰县| 麻栗坡县| 桃源县| 石景山区| 慈利县| 商南县| 东阳市| 左云县| 蓬安县| 方山县| 汶上县| 永春县| 临漳县| 沛县|