C++類 給結構體成員 函式指標 賦值
阿新 • • 發佈:2018-12-31
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 ));
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指定了不同的物件。