AutoCAD 3DMAX C语言 Pro/E UG JAVA编程 PHP编程 Maya动画 Matlab应用 Android
Photoshop Word Excel flash VB编程 VC编程 Coreldraw SolidWorks A Designer Unity3D
 首页 > VC编程

使用c++的成员指针实现类似Borland VCL组件的事件回调机制(上)

51自学网 2015-08-30 http://www.wanshiok.com

 

    并且按如下方式使用:

    A objA;

    B objB;

    objA.OnNotify=objB.ReceiveNotify; //搭建类实例的之间联系,但此语句编译出错!





    在VC中编译,会产生如下的编译错误

       error C2440: '=' : cannot convert from 'void (__thiscall B::*)(int)' to 'void (__cdecl *)(int)'



    上述的编译信息表明两点:

    1.类A的OnNOtify成员变量是NOTIFY_EVENT的调用方式与B::ReceiveNotify不同,前者是  __cdecl方   式,后者则是默认的thiscall方式;

    2. NOTIFY_EVENT与B::ReceiveNotify类型不同,前者是一般的函数指针类型,后者则是针对类B 的函数指针类型 。





成员指针

    顾名思义,就是指向类成员的指针。C++中支持成员指针的定义和使用。如:

    class A

    {

    public:

       int m_IntMember;

       void VoidMethod() {}

    }

    上面的类A中有一个m_IntMember成员变量,一个VoidMethod成员函数。我们可以声明和使用指向它们的成员指针:

    int A::* pInt=&A::m_IntMember;

   

    typedef (B::*METHOD_POINTER)();

    METHOD_POINTER pMethod=&B::VoidMethod;



    A objA; A objB;

    int iVar=objA.*pInt; //直接存取实例objA的m_IntMember值

    objA.*pMethod(); //调用的是实例objA的VoidMethod方法



    objB.*pInt=iVar; //直接存取实例objB的m_IntMember值

    objB.*pMethod(); //调用的是实例objB的VoidMethod方法





    那么,我们如何使用成员指针解决上面编译错误的问题呢? 请看下面代码。

 

//声明针对类B的函数指针类型

typedef void (B::*ERROR_NOTIFY_EVENT)(int notify_code);

class A

{

private:



public:

  ERROR_NOTIFY_EVENT OnNotify;

};



class B

{

private:



public:

 void ReceiveNotify(int notify_code)

 {



 }

};



    A objA;

    B objB;

    objA.OnNotify=objB.ReceiveNotify; //这样就ok了!!!





通过声明针对类B的成员函数指针类型 typedef void (B::*ERROR_NOTIFY_EVENT)(int notify_code),实现类A实例回调类B实例的目的,这就是c++中实现事件回调机制的方法。

 
 
说明
:本教程来源互联网或网友上传或出版商,仅为学习研究或媒体推广,wanshiok.com不保证资料的完整性。

上一篇:一个画图类,类似ms_chart的线图,适用于科学仿真数据分析(二)  下一篇:使用c++的成员指针实现类似Borland VCL组件的事件回调机制(下)