静态回调函数中访问非静态函数和非静态变量

静态回调函数中访问非静态函数和非静态变量

我们知道在C++语言中静态函数如果要访问非静态变量和非静态函数时,只需要把类指针作为参数引入就可以调用了,但是在回调函数中缺无法引入,因为回调函数的调用其格式必须与设置回调函数中的回调函数形参一样,我们无法修改回调函数的格式,但又有必要调用非静态函数和非静态变量时可以参考以下方式。

举例说明:
以下是class VZ_CAMERA中的设置回调和回调函数

    int set_CarInfoCallBack(VzLPRClientHandle handle, VZLPRC_PLATE_INFO_CALLBACK func, void *pUserData, int bEnableImage);  /* 获取车牌识别信息 */
    //添加一个静态函数,让外部函数调用
   static int get_CarInfomation (VzLPRClientHandle handle, void *pUserData, const TH_PlateResult *pResult, unsigned  uNumPlates

                           , VZ_LPRC_RESULT_TYPE  eResultType, const VZ_LPRC_IMAGE_INFO  *pImgFull, const VZ_LPRC_IMAGE_INFO  *pImgPlateClip); /* 通过该回调函数获得车牌识别信息 */

我需要在class MainWindow中实例化这个类并调用设置回调

p_vz->set_CarInfoCallBack(m_hSDK[0], p_vz->get_CarInfomation, this, 0);

经过实验,我直接在MainWindow中声明一个回调函数然后去引用会报错,所以我直接在 VZ_CAMERA这个类中声明并定义了这个回调函数。以下是声明函数,定义函数在第一幅图。

int VZ_CAMERA::get_CarInfomation(VzLPRClientHandle handle, void *, const TH_PlateResult *pResult, unsigned , VZ_LPRC_RESULT_TYPE , const VZ_LPRC_IMAGE_INFO *, const VZ_LPRC_IMAGE_INFO *)
{
	return 0;
}

现在我想要在这个静态函数里面使用一个非静态函数和几个非静态变量,显然作为回调函数,其形参是改不了的,要解决这个问题

  1. 首先,在.h文件中声明一个静态类指针
private:
    static VZ_CAMERA *vz;
  1. 在.cpp文件中头文件下面对其进行初始化
#include "vz_camera.h"

VZ_CAMERA *VZ_CAMERA::vz = nullptr;
  1. 以下是我所要用的非静态变量和非静态函数
    VzLPRClientHandle v_hSDK[6];
    VzLPRClientHandle truehSDK[1];
    QString getTruePlate(QStringList stringList);
    QStringList plateList;
    bool IDENTIFY_FINISHED_FLAG = false;
  1. 在静态回调函数中直接使用 vz 对其进行寻址,以下是我的函数
int VZ_CAMERA::get_CarInfomation(VzLPRClientHandle handle, void *, const TH_PlateResult *pResult, unsigned , VZ_LPRC_RESULT_TYPE , const VZ_LPRC_IMAGE_INFO *, const VZ_LPRC_IMAGE_INFO *)
{
    static byte i = 0;
    if(!vz->IDENTIFY_FINISHED_FLAG) 
    {
        if(i < 10)
        {
            if(vz->v_hSDK[0] == handle && strlen(pResult[0].license) > 0) {
                i++; /* 只有识别到一组完整的数据才加一,放在外面会发送空车号 */
                vz->truehSDK[0] = vz->v_hSDK[0];
                vz->plateList << QString::fromLocal8Bit(pResult[0].license);
            }
            else if (vz->v_hSDK[1] == handle && strlen(pResult[1].license) > 0) {
                i++;
                vz->truehSDK[0] = vz->v_hSDK[1];
                vz->plateList << QString::fromLocal8Bit(pResult[1].license);
            }
            else if(vz->v_hSDK[2] == handle && strlen(pResult[2].license) > 0) {
                i++;
                vz->truehSDK[0] = vz->v_hSDK[2];
                vz->plateList << QString::fromLocal8Bit(pResult[2].license);
            }
            else if(vz->v_hSDK[3] == handle && strlen(pResult[3].license) > 0) {
                i++;
                vz->truehSDK[0] = vz->v_hSDK[3];
                vz->plateList << QString::fromLocal8Bit(pResult[3].license);
            }
            else if(vz->v_hSDK[4] == handle && strlen(pResult[4].license) > 0) {
                i++;
                vz->truehSDK[0] = vz->v_hSDK[4];
                vz->plateList << QString::fromLocal8Bit(pResult[4].license);
            }
            else if(vz->v_hSDK[5] == handle && strlen(pResult[5].license) > 0){
                i++;
                vz->truehSDK[0] = vz->v_hSDK[5];
                vz->plateList << QString::fromLocal8Bit(pResult[5].license);
            }
        }
        else
        {
            QString truePlate = vz->getTruePlate(vz->plateList);
            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;
}

需要源码的可直接评论或者私聊,我会私法给你。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值