程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 怎樣完成類的成員函數作為回調函數

怎樣完成類的成員函數作為回調函數

編輯:關於C++

怎樣完成類的成員函數作為回調函數。本站提示廣大學習愛好者:(怎樣完成類的成員函數作為回調函數)文章只能為提供參考,不一定能成為您想要的結果。以下是怎樣完成類的成員函數作為回調函數正文


假如試圖直接應用C++的成員函數作為回調函數將產生毛病,乃至編譯就不克不及經由過程。其毛病是通俗的C++成員函數都隱含了一個傳遞函數作為參數,亦即“this”指針,C++經由過程傳遞this指針給其成員函數從而完成法式函數可以拜訪C++的數據成員。這也能夠懂得為何C++類的多個實例可以同享成員函數卻-有分歧的數據成員。因為this指針的感化,使得將一個CALL-BACK型的成員函數作為回調函數裝置時就會由於隱含的this指針使得函數參數個數不婚配,從而招致回調函數裝置掉敗。要處理這一成績的症結就是不讓this指針起感化,經由過程采取以下兩種典范技巧可以處理在C++中應用回調函數所碰到的成績。這類辦法具有通用性,合適於任何C++。  

1). 不應用成員函數,為了拜訪類的成員變量,可使用友元操作符(friend),在C++中將該函數解釋為類的友元便可。   

2). 應用靜態成員函數,靜態成員函數不應用this指針作為隱含參數,如許便可以作為回調函數了。靜態成員函數具有兩年夜特色:其一,可以在沒有類實例的情形下應用;其二,只能拜訪靜態成員變量和靜態成員函數,不克不及拜訪非靜態成員變量和非靜態成員函數。因為在C++中應用類成員函數作為回調函數的目標就是為了拜訪一切的成員變量和成員函數,假如做不到這一點將不具有現實意義。處理的方法也很簡略,就是應用一個靜態類指針作為類成員,經由過程在類創立時初始化該靜態指針,如pThis=this,然後在回調函數中經由過程該靜態指針便可以拜訪一切成員變量和成員函數了。 這類處置方法實用於只要一個類實例的情形,由於多個類實例將同享靜態類成員和靜態成員函數,這就招致靜態指針指向最初創立的類實例。為了不這類情形,可使用回調函數的一個參數來傳遞this指針,從而完成數據成員同享。這類辦法稍稍費事,這裡就不再贅述。

起首明確甚麼是回調函數:好比說被調函數void callbackf(int n){}要想作為回調函數的話,callbackf必需作為主調函數的形參湧現,如void f(void (*p(int)),int n)情勢才行!

例子:

例1:

#include<iostream>
using namespace std;
class A
{
public:

 friend void callback()  //友元函數作為回調函數 friend方法完成
 {
  cout<<"回調函數開端履行了!"<<endl;
 }
};
void f(void (*p)())
 {
  p();

 }
int main()
{
 void (*p)();
 p=callback;
 f(p);
 return 0;
}

例2:

#include<iostream>
using namespace std;
class A
{
public:

 static void callback()  //類的成員函數作為回調函數 static方法完成
 {
  cout<<"回調函數開端履行了!"<<endl;
 }
};
void f(void (*p)())
 {
  p();

 }
int main()
{
 void (*p)();
 p=A::callback;
 f(p);
 return 0;
}

還可以把f()函數設為類的成員函數:

#include<iostream>
using namespace std;
class A
{
public:

 static void callback()  //類的成員函數作為回調函數 static方法完成
 {
  cout<<"回調函數開端履行了!"<<endl;
 }
 void f(void (*p)())
 {
  p();

 }
};

int main()
{
 A a;
 void (*p)();
 p=A::callback;
 a.f(p);
 return 0;
}

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