若何運用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++的函數對象能有所贊助,假如有疑問迎接年夜家留言評論辯論。