最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

如何應(yīng)用C++的函數(shù)對象

 更新時間:2016年08月14日 08:59:37   投稿:daisy  
C++函數(shù)對象是C語言程序的主要組成部分,一個函數(shù)可以調(diào)用其他函數(shù)。在設(shè)計良好的程序中,每個函數(shù)都有特定的目的。本文將介紹C++函數(shù)對象的應(yīng)用,有需要的可以參考學(xué)習。

前言

C++函數(shù)對象是通過一張?zhí)摵瘮?shù)表來實現(xiàn)的。簡稱為V-Table。在這個表中,主是要一個類的虛函數(shù)的地址表,這張表解決了繼承、重載的問題,保證其容真實反應(yīng)實際的函數(shù)。

應(yīng)用

假如我們實現(xiàn)了這樣的一個單向鏈表:

class LinkedListNode {
 int data_;
 LinkedListNode *next_;
};
class LinkedList {
 public:
 void insert(LinkedListNode* &p);
 void del(LinkedListNode *p);
 private:
 LinkedListNode *head_;
};

其中insertp插入到head_為頭指針的鏈表中,而p對應(yīng)的內(nèi)存由外面分配好,調(diào)用的時候類似于這樣:

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

其中,p可能是通過new得到,也可能是malloc出來。好,問題來了:

這個類的del函數(shù)應(yīng)該如何實現(xiàn)呢?如果節(jié)點是new出來的,我們得delete;如果是malloc出來的,我們得使用配套的free。否則,行為就是undefined。而且,用戶還可能實現(xiàn)了自己的定制的內(nèi)存分配回收例程。我們并不知道該內(nèi)存是如何分配得到的。這就是問題所在。

解決方法是讓用戶將正確的、對應(yīng)的、適配的資源釋放例程傳遞進來,然而deleteexpressionfree是函數(shù),更悲劇的是不同用戶實現(xiàn)的資源回收函數(shù)原型不盡相同。如何做呢?函數(shù)對象是解決這個問題的利器。

我們可以這樣:

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);//調(diào)用用戶提供的資源回收例程
}

用戶需要實現(xiàn)自己的CallBack類的operator()成員函數(shù)。如下所示:

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

總結(jié)

以上就是C++函數(shù)對象的應(yīng)用的全部內(nèi)容,希望本文的內(nèi)容對大家學(xué)習C++的函數(shù)對象能有所幫助,如果有疑問歡迎大家留言討論。

相關(guān)文章

  • 教你用C語言實現(xiàn)三子棋

    教你用C語言實現(xiàn)三子棋

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)簡單三子棋程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • C語言新手練習題之求第n個斐波那契數(shù)

    C語言新手練習題之求第n個斐波那契數(shù)

    斐波那契數(shù)列這一個大一上C語言就有的問題大家應(yīng)該都不陌生,下面這篇文章主要給大家介紹了關(guān)于C語言新手練習題之求第n個斐波那契數(shù)的相關(guān)資料,文中通過圖文以及實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-11-11
  • Qt實現(xiàn)邊加載數(shù)據(jù)邊顯示頁面的示例代碼

    Qt實現(xiàn)邊加載數(shù)據(jù)邊顯示頁面的示例代碼

    無論是MFC框架還是QT框架,實現(xiàn)加載數(shù)據(jù)的等待效果都是很麻煩的,不像WEB端輕輕松松一句代碼就搞定了。本文將通過Qt實現(xiàn)邊加載數(shù)據(jù)邊顯示頁面的功能,需要的可以參考一下
    2022-01-01
  • opencv3/C++實現(xiàn)光流點追蹤

    opencv3/C++實現(xiàn)光流點追蹤

    今天小編就為大家分享一篇opencv3/C++實現(xiàn)光流點追蹤,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • 深入探究C++編程中的資源泄漏問題以及排查方法

    深入探究C++編程中的資源泄漏問題以及排查方法

    在C++程序開發(fā)維護過程中,時常會遇到資源泄漏問題,比如GDI對象泄漏、進程線程句柄泄漏以及內(nèi)存泄漏問題,今天我們就來深入探討一下這幾類資源泄漏以及排查這些泄露的辦法,需要的朋友可以參考下
    2023-10-10
  • C++ Boost Thread線程使用示例詳解

    C++ Boost Thread線程使用示例詳解

    Boost是為C++語言標準庫提供擴展的一些C++程序庫的總稱。Boost庫是一個可移植、提供源代碼的C++庫,作為標準庫的后備,是C++標準化進程的開發(fā)引擎之一,是為C++語言標準庫提供擴展的一些C++程序庫的總稱
    2022-11-11
  • C++ boost scoped_ptr智能指針詳解

    C++ boost scoped_ptr智能指針詳解

    智能指針是一種像指針的C++對象,但它能夠在對象不使用的時候自己銷毀掉。雖然STL提供了auto_ptr,但是由于不能同容器一起使用(不支持拷貝和賦值操作),因此很少有人使用。它是Boost各組件中,應(yīng)用最為廣泛的一個
    2022-11-11
  • C語言中時間的基本用法小結(jié)

    C語言中時間的基本用法小結(jié)

    處理時間是編程中經(jīng)常遇到的問題,C語言中提供了一些時間處理函數(shù),在此記錄下一些基本的用法。下面這篇文章主要給大家介紹了C語言中關(guān)于時間的基本用法的相關(guān)資料,需要的朋友可以參考借鑒,感興趣的朋友們來一起看看吧。
    2017-01-01
  • C++快速冪與大數(shù)取模算法示例

    C++快速冪與大數(shù)取模算法示例

    這篇文章主要介紹了C++快速冪算法和大數(shù)取模算法的示例,對C++程序員來說有一定的幫助,有需要的朋友可以參考借鑒,下面來一起看看。
    2016-08-08
  • 匯編語言rep movsd 的使用詳解

    匯編語言rep movsd 的使用詳解

    rep movsd 每次ecx!=0便執(zhí)行movsd ,然后ecx=ecx-1 movsd移動ds:[si] 到es:[di],在32位匯編下可以用esi代替si,edi代替di
    2013-09-09

最新評論

西贡区| 霍城县| 清新县| 仙居县| 合作市| 疏附县| 永善县| 鲜城| 榆中县| 商都县| 兴和县| 和平区| 旅游| 尼玛县| 阳山县| 五河县| 建湖县| 闽清县| 平塘县| 广东省| 巴青县| 洛阳市| 德化县| 沙雅县| 武冈市| 睢宁县| 河北省| 绥阳县| 乌拉特中旗| 瑞丽市| 虹口区| 罗平县| 昆山市| 南平市| 北海市| 湖州市| 台南市| 团风县| 金塔县| 东海县| 栾川县|