我有第三方类型定义:
typedef void (*NexTouchEventCb)(void *ptr);
在第三方库中的函数中使用的是:
void NexTouch::attachPop(NexTouchEventCb pop, void *ptr)
如果我有一个.cpp文件,那么我可以成功调用attachPop
而不会出现任何编译错误:
NexButton b0 = NexButton(0, 1, "b0");
void b0PopCallback(void *ptr)
{
// do something here
}
b0.attachPop(b0PopCallback, &b0);
但我做OOP,所以我有自己的标题和类文件:
MyNextion.h
class MyNextion {
public:
void init();
void b0PopCallback(void *ptr);
private:
NexButton *b0;
}
MyNextion.cpp
#include "MyNextion.h"
void MyNextion::init() {
b0 = new NexButton(0, 1, "b0");
b0->attachPop(/* what should I put here? */);
}
void MyNextion::b0PopCallback(void *ptr) {
// do something here
}
我也经历了几个类似的问题,例如this,this和this。但我只是不明白。
请注意,此代码是为Arduino编译的,Arduino是一个AVR微控制器。特殊C ++语法可能不可用。
您能告诉我应该如何致电b0->attachPop
我为什么要这样打电话?
请注意,我无法修改第三方库,可在此处找到:https://github.com/itead/ITEADLIB_Arduino_Nextion
答案 0 :(得分:2)
您只能以这种方式使用静态成员函数(或非成员函数)。幸运的是,您的API会传递一个额外的void*
指针,您可以在其中放置要调用的对象:
class MyNextion {
public:
void init();
void b0PopCallback();
private:
static void b0PopStaticCallback(void *ptr);
NexButton *b0;
};
void MyNextion::b0PopStaticCallback(void *ptr)
{
static_cast<MyNextion*>(ptr)->b0PopCallback();
}
void MyNextion::init()
{
b0 = new NexButton(0, 1, "b0");
b0->attachPop(b0PopStaticCallback, this);
}