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指定了不同的对象。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值