前言
c++函式物件是通過一張虛函式表來實現的。簡稱為v-table。在這個表中,主是要乙個類的虛函式的位址表,這張表解決了繼承、過載的問題,保證其容真實反應實際的函式。
應用假如我們實現了這樣的乙個單向鍊錶:
class linkedlistnode ;
class linkedlist ;
其中insert將p插入到head_為頭指標的鍊錶中,而p對應的記憶體由外面分配好,呼叫的時候類似於這樣:
linkedlist list;
linkedlistnode *p www.cppcns.com= new linkedlistnode(2, null);
list.insert(p);
其中,p可能是通過new得到,也可能是malloc出來。好,問題來了:
這個類的del函式應該如何實現呢?如果節點是new出來的,我們得delete;如果是malloc出來的,我們得www.cppcns.com使用配套的free。否則,行為就是undefined。而且,使用者還可能實現了自己的定製的記憶體分配**例程。我們並不知道該記憶體是如何分配得到的。這就是問題所在。
解決方法是讓使用者將正確的、對應的、適配的資源釋放例程傳遞進來,然而delete是expression,free是函式,更悲劇的是不同使用者實現的資源**函式原型不盡相同。如何做呢?函式物件是解決這個問題的利器。
我們可以這樣:
template
class linkedlist
;在del中:
void del(linkedlistnode *p)
使用者需要實現自己的callback類程式設計客棧的operator()成員函式。如下所示:
class myreclaimroutine };
然後就萬事大吉了:
linkedlist list;
linkedlistnode *p = new linkedlistnode(2, null);
list.insert(p);
list.del(p);//ok! delete p will be called
總結本文標題: 如何應用c++的函式物件
本文位址:
C 如何向函式傳遞物件
一.值傳遞 函式中如果對物件進行了修改,物件的值不變 相當於建立物件的乙個副本傳遞給函式 include using namespace std class test test void setnum int a int getnum private int num 值傳遞 void add tes...
C 的函式物件
函式物件,又叫仿函式或函式子,英文是 function object 或 functor.乙個實現了函式呼叫操作符 即 operator 的類或結構體,就是仿函式。operator 就叫做函式呼叫操作符,英文是 function call operator.下面是乙個例子。include inclu...
c 函式物件
標準庫里的count if可以統計容器中滿足特定條件的元素的個數。例如要統計乙個整數vector ivec中正數的個數,可以先寫乙個返回型別為bool,含有乙個int引數的條件函式 class pred 這樣,剛才的統計語句就應該寫成 count if ivec.begin ivec.end pre...