静态回调函数中访问非静态函数和非静态变量
我们知道在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;
}
现在我想要在这个静态函数里面使用一个非静态函数和几个非静态变量,显然作为回调函数,其形参是改不了的,要解决这个问题
- 首先,在.h文件中声明一个静态类指针
private:
static VZ_CAMERA *vz;
- 在.cpp文件中头文件下面对其进行初始化
#include "vz_camera.h"
VZ_CAMERA *VZ_CAMERA::vz = nullptr;
- 以下是我所要用的非静态变量和非静态函数
VzLPRClientHandle v_hSDK[6];
VzLPRClientHandle truehSDK[1];
QString getTruePlate(QStringList stringList);
QStringList plateList;
bool IDENTIFY_FINISHED_FLAG = false;
- 在静态回调函数中直接使用 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;
}
需要源码的可直接评论或者私聊,我会私法给你。