若何運用C++的函數對象。本站提示廣大學習愛好者:(若何運用C++的函數對象)文章只能為提供參考,不一定能成為您想要的結果。以下是若何運用C++的函數對象正文
媒介
C++函數對象是經由過程一張虛函數表來完成的。簡稱為V-Table。在這個表中,主是要一個類的虛函數的地址表,這張表處理了繼續、重載的成績,包管其容真實反響現實的函數。
運用
假設我們完成了如許的一個單向鏈表:
class LinkedListNode { int data_; LinkedListNode *next_; }; class LinkedList { public: void insert(LinkedListNode* &p); void del(LinkedListNode *p); private: LinkedListNode *head_; };
個中insert
將p
拔出到head_
為頭指針的鏈表中,而p對應的內存由裡面分派好,挪用的時刻相似於如許:
LinkedList list; LinkedListNode *p = new LinkedListNode(2, NULL); list.insert(p);
個中,p
能夠是經由過程new
獲得,也能夠是malloc
出來。好,成績來了:
這個類的del
函數應當若何完成呢?假如節點是new
出來的,我們得delete
;假如是malloc
出來的,我們得應用配套的free
。不然,行動就是undefined
。並且,用戶還能夠完成了本身的定制的內存分派收受接管例程。我們其實不曉得該內存是若何分派獲得的。這就是成績地點。
處理辦法是讓用戶將准確的、對應的、適配的資本釋放例程傳遞出去,但是delete
是expression
,free
是函數,更喜劇的是分歧用戶完成的資本收受接管函數原型不盡雷同。若何做呢?函數對象是處理這個成績的利器。
我們可以如許:
template<typename CallBack> class LinkedList { public: void insert(LinkedListNode* &p); void del(LinkedListNode *p); private: LinkedListNode *head_; };
在del中:
void del(LinkedListNode *p) { //... LinkedListNode *prev = get_prev(p); prev->next_ = p->next_; CallBack cb; cb(p);//挪用用戶供給的資本收受接管例程 }
用戶須要完成本身的CallBack
類的operator()
成員函數。以下所示:
class MyReclaimRoutine { public: void operator() (LinkedListNode *p) { delete p; //free(p) ? my_release_func(p) ? all up to you! } };
然後就萬事年夜吉了:
LinkedList<MyReclaimRoutine> list; LinkedListNode *p = new LinkedListNode(2, NULL); list.insert(p); list.del(p);//ok! delete p will be called
總結
以上就是C++函數對象的運用的全體內容,願望本文的內容對年夜家進修C++的函數對象能有所贊助,假如有疑問迎接年夜家留言評論辯論。