青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆 - 505  文章 - 1034  trackbacks - 0
<2009年8月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
303112345


子曾經(jīng)曰過:編程無他,唯手熟爾!

常用鏈接

留言簿(94)

隨筆分類(649)

隨筆檔案(505)

相冊

BCB

Crytek

  • crymod
  • Crytek's Offical Modding Portal

Game Industry

OGRE

other

Programmers

Qt

WOW Stuff

搜索

  •  

積分與排名

  • 積分 - 923078
  • 排名 - 14

最新隨筆

最新評論

閱讀排行榜

評論排行榜

阿來點(diǎn)評:這篇文章寫得真是好,無論是內(nèi)容還是排版,我一直有把member function 作為回調(diào)函數(shù)的欲望,但是試了一次發(fā)現(xiàn)不行;現(xiàn)在知道是隱含的this指針的問題。總之,這篇文章不僅解開了我心中的疑團(tuán),還提供了兩種解決方案,我真是感激地痛苦流涕啊!



提出問題:

回調(diào)函數(shù)是基于C編程的Windows SDK的技術(shù),不是針對C++的,程序員可以將一個C函數(shù)直接作為回調(diào)函數(shù),但是如果試圖直接使用C++的成員函數(shù)作為回調(diào)函數(shù)將發(fā)生錯誤,甚至編譯就不能通過。
分析原因:
普通的C++成員函數(shù)都隱含了一個傳遞函數(shù)作為參數(shù),亦即“this”指針,C++通過傳遞一個指向自身的指針給其成員函數(shù)從而實(shí)現(xiàn)程序函數(shù)可以訪問C++的數(shù)據(jù)成員。這也可以理解為什么C++類的多個實(shí)例可以共享成員函數(shù)但是確有不同的數(shù)據(jù)成員。由于this指針的作用,使得將一個CALLBACK型的成員函數(shù)作為回調(diào)函數(shù)安裝時就會因?yàn)殡[含的this指針使得函數(shù)參數(shù)個數(shù)不匹配,從而導(dǎo)致回調(diào)函數(shù)安裝失敗
解決方案:
一,不使用成員函數(shù),直接使用普通C函數(shù),為了實(shí)現(xiàn)在C函數(shù)中可以訪問類的成員變量,可以使用友元操作符(friend),在C++中將該C函數(shù)說明為類的友元即可。這種處理機(jī)制與普通的C編程中使用回調(diào)函數(shù)一樣。
二,使用靜態(tài)成員函數(shù),靜態(tài)成員函數(shù)不使用this指針作為隱含參數(shù),這樣就可以作為回調(diào)函數(shù)了。靜態(tài)成員函數(shù)具有兩大特點(diǎn):其一,可以在沒有類實(shí)例的情況下使用;其二,只能訪問靜態(tài)成員變量和靜態(tài)成員函數(shù),不能訪問非靜態(tài)成員變量和非靜態(tài)成員函數(shù)。由于在C++中使用類成員函數(shù)作為回調(diào)函數(shù)的目的就是為了訪問所有的成員變量和成員函數(shù),如果作不到這一點(diǎn)將不具有實(shí)際意義。我們通過使用靜態(tài)成員函數(shù)對非靜態(tài)成員函數(shù)包裝的辦法來解決問題。類實(shí)例可以通過附加參數(shù)全局變量的方式的方式傳遞到靜態(tài)成員函數(shù)中。分別舉例如下:
1,參數(shù)傳遞的方式
   #include <iostream.h>  
   class TClassA
   {
   public:

 

      void Display(const char* text) { cout << text << endl; };
      static void Wrapper_To_Call_Display(void* pt2Object, char* text);
      // more....
   };

   // 靜態(tài)包裝函數(shù),能夠調(diào)用成員函數(shù)Display(),本身做為回調(diào)函數(shù)來使用
   void TClassA::Wrapper_To_Call_Display(void* pt2Object, char* string)
   {
       // 顯式類型轉(zhuǎn)換
       TClassA* mySelf = (TClassA*) pt2Object;

       // 調(diào)用普通成員函數(shù)
       mySelf->Display(string);
   }

   // 回調(diào)函數(shù)的宿主,在這里回調(diào)用函數(shù)被使用
   void DoItA(void* pt2Object, void (*pt2Function)(void* pt2Object, char* text))
   {
      // 使用回調(diào)函數(shù)
      pt2Function(pt2Object, "hi, i'm calling back using a argument ;-)"); 
   }

   // 執(zhí)行示例
   void Callback_Using_Argument()
   {
      TClassA objA;
      DoItA((void*) &objA, TClassA::Wrapper_To_Call_Display);
   }

2,全局變量的方式
   #include <iostream.h>  
   void* pt2Object;        // 全局變量,可以指向任意對象
   class TClassB
   {
   public:

      void Display(const char* text) { cout << text << endl; };
      static void Wrapper_To_Call_Display(char* text);

   };

   // 靜態(tài)的包裝函數(shù)
   void TClassB::Wrapper_To_Call_Display(char* string)
   {
       //需要保證全局變量值的正確性
       TClassB* mySelf = (TClassB*) pt2Object;
       mySelf->Display(string);
   }

   // 回調(diào)用函數(shù)的宿主,在這里回調(diào)用函數(shù)被使用
   void DoItB(void (*pt2Function)(char* text))
   {
  
      pt2Function("hi, i'm calling back using a global ;-)");   // make callback
   }

   // 執(zhí)行示例
   void Callback_Using_Global()
   {
      TClassB objB;  
      pt2Object = (void*) &objB;
      DoItB(TClassB::Wrapper_To_Call_Display);
   }

注意:通過上面兩種方法的比較可以看出,第2種方法中靜態(tài)包裝函數(shù)可以和普通成員函數(shù)保持簽名一致,當(dāng)回調(diào)函數(shù)的宿主接口不能改變時,這種方法特別有用。但因?yàn)槭褂昧巳肿兞浚膊皇且粋€好的設(shè)計(jì)。

posted on 2007-08-06 10:21 七星重劍 閱讀(1092) 評論(3)  編輯 收藏 引用 所屬分類: PL--c/c++

FeedBack:
# re: [轉(zhuǎn)]將類成員函數(shù)用做C回調(diào)函數(shù) 2007-11-12 14:18 stepchen87
你寫的例子太亂了,一個簡單的問題代碼體現(xiàn)得這么混亂。  回復(fù)  更多評論
  
# re: [轉(zhuǎn)]將類成員函數(shù)用做C回調(diào)函數(shù) 2007-11-13 06:58 重劍
@stepchen87
這個代碼一點(diǎn)都不亂啊,才幾行啊
小伙兒耐心點(diǎn)啊
要不你寫幾行簡潔的?  回復(fù)  更多評論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
      <noscript id="pjuwb"></noscript>
            <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
              <dd id="pjuwb"></dd>
              <abbr id="pjuwb"></abbr>
              亚洲午夜久久久久久久久电影网| 午夜天堂精品久久久久 | 国产亚洲欧美一区二区| 久久综合中文| 欧美三区不卡| 欧美成人午夜激情在线| 国产精品久久久久久久久免费樱桃| 亚洲一区二区三区视频| 久久久精品国产免费观看同学| 亚洲一区免费| 伊人蜜桃色噜噜激情综合| 久久综合影音| 国产亚洲精品久久飘花| 99国产一区| 日韩一级精品| 久久久久久黄| 久久成人亚洲| 国产欧美一区二区精品性色| 在线视频一区二区| 欧美精品在线免费播放| 国产精品扒开腿爽爽爽视频| 亚洲无线视频| 欧美精品在线免费观看| 亚洲二区视频在线| 一区二区亚洲| 亚洲字幕在线观看| 久久精品国产91精品亚洲| 亚洲一区二区三区四区在线观看| 欧美黑人一区二区三区| 欧美激情第1页| 91久久久国产精品| 欧美激情网站在线观看| 亚洲国产成人高清精品| 亚洲美女视频网| 欧美大学生性色视频| 亚洲午夜一区二区三区| 国产精品大片| 亚洲欧美日韩专区| 欧美精品国产精品| 久久久精品国产免大香伊| 国产午夜精品理论片a级大结局| 亚洲欧美日韩精品久久亚洲区 | 国产精品扒开腿爽爽爽视频| 亚洲制服av| 久久天天躁夜夜躁狠狠躁2022| 国内精品久久久久久久影视蜜臀 | 欧美三区在线| 久久免费视频网站| 一本色道久久综合狠狠躁的推荐| 蜜桃av综合| 一本色道久久综合狠狠躁篇的优点 | 欧美黄网免费在线观看| 夜夜嗨av色综合久久久综合网| 亚洲欧美日韩综合一区| 亚洲国产精品v| 欧美一区二区三区免费观看视频| 在线观看欧美日韩| 欧美激情精品久久久久久蜜臀| 亚洲一区在线免费观看| 激情欧美亚洲| 国产欧美一区二区色老头| 美日韩在线观看| 亚洲欧美另类久久久精品2019| 久久中文在线| 国产一区二区三区免费不卡| 欧美日本中文字幕| 久久伊人精品天天| 久久这里只有精品视频首页| 欧美怡红院视频| 精品动漫3d一区二区三区| 欧美一区二区三区免费视频| 亚洲图片欧洲图片日韩av| 国产乱理伦片在线观看夜一区| 欧美大片在线看免费观看| 久久久久久久综合| 久久激五月天综合精品| 欧美一区=区| 亚洲字幕一区二区| 制服丝袜亚洲播放| 一区二区三区高清在线| 一区二区毛片| 亚洲欧美电影院| 亚洲一级网站| 女人天堂亚洲aⅴ在线观看| 久久在线免费| 欧美粗暴jizz性欧美20| 欧美激情中文字幕一区二区| 亚洲激情成人在线| 一区二区三区视频在线观看| 国产一区二区三区自拍| 欧美日本高清一区| 久久久亚洲精品一区二区三区| 久久精品国产第一区二区三区| 久久久久久久一区| 欧美激情一区| 亚洲深夜福利视频| 亚洲欧美激情一区二区| 久久aⅴ国产欧美74aaa| 农村妇女精品| 国产精品久久999| 在线免费观看日韩欧美| 在线精品国精品国产尤物884a| 久久免费视频在线| 欧美日韩一区二区在线视频| 国产精品中文字幕在线观看| 欧美视频网站| 亚洲精选视频免费看| 欧美一区在线直播| 亚洲激情视频在线播放| 亚洲午夜精品17c| 欧美日韩视频专区在线播放 | 裸体丰满少妇做受久久99精品| 欧美日韩一区成人| 亚洲精品午夜| 亚洲国产免费| 久久综合激情| 国产乱码精品一区二区三区五月婷| 欧美日韩免费看| 亚洲国产精品一区二区www在线| 国产精品久久999| 亚洲天堂免费在线观看视频| 亚洲国产另类久久久精品极度| 久久精品国产亚洲5555| 欧美日韩裸体免费视频| 亚洲美女av电影| 亚洲第一色中文字幕| 久久激五月天综合精品| 亚洲国产精品久久久久| 午夜国产精品影院在线观看| 欧美另类视频| 日韩一级欧洲| 亚洲精品麻豆| 国产精品久久久久免费a∨ | 91久久精品国产91性色tv| 欧美日韩日本视频| 国产精品私拍pans大尺度在线| 一区二区三区欧美视频| 99视频有精品| 欧美亚洲网站| 国产午夜久久久久| 狼人天天伊人久久| 欧美精品一区二区三区视频| 翔田千里一区二区| 久久久精品欧美丰满| 99精品国产在热久久婷婷| 亚洲视频中文字幕| 在线观看91精品国产入口| 欧美视频久久| 美女网站久久| 欧美久久久久久久久久| 久久久97精品| 欧美日韩精品一区二区三区四区| 欧美一区午夜精品| 老司机成人网| 久久国产婷婷国产香蕉| 美女精品在线观看| 午夜欧美视频| 欧美国产欧美亚洲国产日韩mv天天看完整 | 一本一本久久| 久久久久中文| 久久精品国产综合| 欧美啪啪一区| 欧美激情1区| 精品99视频| 香蕉国产精品偷在线观看不卡| 午夜久久久久| 亚洲毛片在线| 欧美大秀在线观看| 欧美gay视频激情| 国产自产女人91一区在线观看| 在线一区观看| 亚洲在线黄色| 欧美日韩一级片在线观看| 亚洲国产精品va在看黑人| 在线观看视频一区二区| 午夜精品剧场| 午夜在线精品偷拍| 鲁大师成人一区二区三区| 欧美日韩国产大片| 国产热re99久久6国产精品| 一区二区高清| 性欧美video另类hd性玩具| 国产精品免费看片| 午夜精品剧场| 久久久国产精彩视频美女艺术照福利 | 亚洲国内高清视频| 亚洲视频一二| 国产农村妇女精品| 欧美在线日韩| 欧美国产激情二区三区| 亚洲片国产一区一级在线观看| 免费成人在线视频网站| 亚洲精品一二区| 欧美一区二区在线| 在线观看中文字幕不卡| 欧美日本一区二区三区| 亚洲在线播放| 牛牛国产精品| 日韩视频在线观看免费| 国产精品丝袜xxxxxxx|