1. 程式人生 > >C++類 給結構體成員 函式指標 賦值

C++類 給結構體成員 函式指標 賦值

myStruct標頭檔案 myStruct.h

class CMyClass;
struct
{
 int nFlag;
 void (CMyClass::*myinit)(int n);
 void (CMyClass::*myopen)(int n,void* arg);
 void (CMyClass::*myclose)(int);
 ...
}myStruct;

CMyClass標頭檔案
class CMyClass
{
//構造 析構等
   ...

//成員變數
 myStruct myStr;

// 成員函式1
 void myClassInit()

 void myinit(int n);
 void myopen(int n,void* arg);
 void myclose(int n);
};

CMyClass實現 cpp檔案
...

void CMyClass::myClassInit()
{
 struct myStruct myStr1 = 
 {
   0,
   this->myinit;
   this->myopen;
   this->myclose;
   ...
 };
 memcpy(&myStr,&myStr1 ,sizeof(myStruct ));
}

...後面會頻繁用用myStr變數呼叫該結構體變數裡面的函式

這樣寫法用VC6可以編譯通過,也可以執行;
還有一種寫法,如下:

myStruct標頭檔案 myStruct.h

struct
{
 int nFlag;
 void (*myinit)(void* pObj,int n);
 void (*myopen)(void* pObj,int n,void* arg);
 void (*myclose)(void* pObj,int);
 ...
}myStruct;

CMyClass標頭檔案
class CMyClass
{
//構造 析構等
   ...

//成員變數
 myStruct myStr;

// 成員函式1
 void myClassInit()

 static void myinit(void* pObj,int n);
 static void myopen(void* pObj,int n,void* arg);
 static void myclose(void* pObj,int n);
};

//引數中的void* pObj用來傳遞CMyClass物件例項的指標,以便呼叫其他的非靜態成員
CMyClass實現 cpp檔案
...

void CMyClass::myClassInit()
{
 struct myStruct myStr1 = 
 {
   0,
   this->myinit;
   this->myopen;
   this->myclose;
   ...
 };
 memcpy(&myStr,&myStr1 ,sizeof(myStruct ));

}

第一種寫法傳不是指向靜態函式,是指向類普通成員的函式。在使用是必須有CMyClass物件呼叫的

obj.(myStr.func)(引數): .(myStr.func)相當於指向類普通成員的函式指標,必須有物件!

而第2種寫法這樣用:CMyClass::myStr.func)(引數)

第一種方式傳遞給變數myStr的函式指標為非靜態函式,由於函式中隱含了this,所以函式能夠根據this指標區分出不同的物件。
第二種方式的為靜態函式,但是你顯示的指定了this即void *pObj,使得靜態函式仍然能夠區分出不同的類物件。
綜上這兩種方式在多個CMyClass物件情況下,不會有衝突,因為你已經通過this指標或者void *pObj指定了不同的物件。