程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 若何運用C++的函數對象

若何運用C++的函數對象

編輯:關於C++

若何運用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_;
};

個中insertp拔出到head_為頭指針的鏈表中,而p對應的內存由裡面分派好,挪用的時刻相似於如許:

LinkedList list;
LinkedListNode *p = new LinkedListNode(2, NULL);
list.insert(p);

個中,p能夠是經由過程new獲得,也能夠是malloc出來。好,成績來了:

這個類的del函數應當若何完成呢?假如節點是new出來的,我們得delete;假如是malloc出來的,我們得應用配套的free。不然,行動就是undefined。並且,用戶還能夠完成了本身的定制的內存分派收受接管例程。我們其實不曉得該內存是若何分派獲得的。這就是成績地點。

處理辦法是讓用戶將准確的、對應的、適配的資本釋放例程傳遞出去,但是deleteexpressionfree是函數,更喜劇的是分歧用戶完成的資本收受接管函數原型不盡雷同。若何做呢?函數對象是處理這個成績的利器。

我們可以如許:

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved