首页 > 编程知识 正文

静态方法调用非静态成员,虚函数是一个非成员函数

时间:2023-05-04 19:46:36 阅读:166651 作者:3682

静态回调函数中访问非静态函数和非静态变量我们知道在C语言中静态函数访问非静态变量和非静态函数时,只需将类指针作为参数引入即可调用,但不能引入回调函数。 回调函数的调用格式必须与设置回调函数的回调函数参数的格式相同,因此不能更改回调函数的格式,但如果需要调用非静态函数和非静态变量,请使用以下方法:

举例说明:

以下是class VZ_CAMERA的回调和回调函数设置

intset _ carinfocallback (vzlprclienthandlehandle,VZLPRC_PLATE_INFO_CALLBACK func,void *pUserData, 获取intbenableing /*车牌识别信息*///外部函数是staticintget _ car infomation (vzlprclienthandlehandle,void *pUserData, 添加静态函数以调用constth_plateresuure的unsigned uNumPlates,VZ_LPRC_RESULT_TYPE eResultType,const vz _ lprc _ image constvz_lprc_info*pimgfull /*从此回调函数获取车牌识别信息*/必须在class MainWindow中实例化此类并调用回调设置

p _ vz-set _ carinfocallback (m _ hsdk [0],p_vz-get_CarInfomation,this,0 ); 根据实验结果,如果直接在MainWindow中声明回调函数,然后进行引用,则会报告错误,因此我们在名为VZ_CAMERA的类中直接声明并定义了回调函数。 以下声明函数,并定义函数位于第一个图中。

intvz _ camera :3360 get _ car infomation (vzlprclienthandlehandle,void *,const TH_PlateResult *pResult,unsiged car }现在,我想在这个静态函数中使用非静态函数和一些非静态变量。 很明显,作为回调函数,其参数是不可更改的。 要解决这个问题

首先,在. h文件中输入静态类指针private: static VZ_CAMERA *vz; 在. cpp文件的头文件下,初始化头文件。 # include ' vz _ camera.h ' vz _ camer a* vz _ camera 33603360 vz=nullptr; 以下是我要使用的非静态变量和非静态函数VzLPRClientHandle v_hSDK[6]; VzLPRClientHandle truehSDK[1]; qstringgettrueplate (qstringliststringlist ); QStringList plateList; bool identify _ finished _ flag=false; 静态回调函数直接使用vz进行寻址。 以下是我的函数intvz _ camera 3360: get _ car infomation (vzlprclienthandlehandle,void *,const th _ plate result。vz _ lprc _ car if (! vz-identify _ finished _ flag (if (i10 ) if ) vz-v_hsdk(0)==handlestrlen ) presult(0).license) )/vz-platelistqstring :3360 from local 8bit (presult [0].license ); } else if (vz-v _ hsdk [1]==handle strlen (presult [1].license )0) ) I; vz-truehSDK[0]=vz-v_hSDK[1]; vz-platelistqstring :3360 from local 8bit (presult [1].license ); } else if (vz-v _ hsdk [2]==handle strlen (presult [2].license )0) ) I; vz-truehSDK[0]=vz-v_hSDK[2]; vz-platelistqstring :3360 from local 8bit (presult [2].license ); } else if (vz-v _ hsdk [3]==handle strlen (presult [3].license )0) ) I; vz-truehSDK[0]=vz-v_hSDK[3]; vz-platelistqstring :3360 from local 8bit (presult [3].license ); } else if (vz-v _ hsdk [4]==handle strlen (presult [4].license )0) ) I; vz-truehSDK[0]=vz-v_hSDK[4]; vz-platelistqstring :3360 from local 8bit (presult [4].license ); } else if (vz-v _ hsdk [5]==handle strlen (presult [5].license )0) ) I; vz-truehSDK[0]=vz-v_hSDK[5]; vz-platelistqstring :3360 from local 8bit (presult [5].license ); } else { qstringtrueplate=vz-gettrueplate (vz-plate list ); vz-IDENTIFY_FINISHED_FLAG=true;/*只识别10次,注意将FLAG设定为FALSE的时间*/i=0; /*下次从0开始计数*/CAR_INFO car_info; car_info.plate=truePlate; car_info.handle=vz-truehSDK[0]; QVariant datainfo; datainfo.setvalue(car_info; /*包装发送*/emit vz-signal _ sendcarinfo (datainfo ); datainfo.clear (; } } return 0; }需要源代码的直接评论和私聊,在私法中列举。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。