如何正确地将指针传递给第三方代码的成员函数

How to properly pass a pointer to a member function for a 3rd party code?

本文关键字:代码 第三方 成员 函数 正确地 指针      更新时间:2023-10-16

我有这个第三方类型的定义:

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);

但是我糟糕,所以我有自己的标题和类文件:

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
}

我也遇到了几个类似的问题,也是这个问题。但是我只是不明白。

请注意,此代码是为Avr微控制器的Arduino编辑的。特殊的C 语法可能不可用。

您能告诉我如何打电话给b0->attachPop,为什么要以这种方式打电话?

请注意,我无法修改第三方库,可以在此处找到:https://github.com/itead/iteadlib_arduino_nextion

您只能以这种方式使用静态成员函数(或非成员函数)。幸运的是,您的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);
}