如何正确地将指针传递给第 3 方代码的成员函数? [复制]

Posted

技术标签:

【中文标题】如何正确地将指针传递给第 3 方代码的成员函数? [复制]【英文标题】:How to properly pass a pointer to a member function for a 3rd party code? [duplicate] 【发布时间】:2016-11-30 19:00:30 【问题描述】:

我有这个第 3 方类型定义:

typedef void (*NexTouchEventCb)(void *ptr);

在第 3 方库中的函数中使用:

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 编译的,它是一个 AVR 微控制器。特殊的 C++ 语法可能不可用。

你能告诉我应该怎么打电话给b0->attachPop,我为什么要那样打电话?

请注意,我无法修改 3rd 方库,可在此处找到:https://github.com/itead/ITEADLIB_Arduino_Nextion

【问题讨论】:

我也会看看这个问题。我还添加了一条注释,说明我正在为 Arduino 进行编译,它是一个 AVR 微控制器。 可能的重复没有提到静态成员函数的做法。 还有很多很多其他可能的重复项,但您只能用一个标记一个问题。 【参考方案1】:

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

【讨论】:

非常感谢!我永远不会想到这一点。

以上是关于如何正确地将指针传递给第 3 方代码的成员函数? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Python 和 ctypes:如何正确地将“指针对指针”传递给 DLL?

如何合法地将函数指针转换为方法指针?

在 C# 中如何正确地将 int 数组传递给函数

在 gcc 上将成员函数指针传递给模板成员函数时出现问题

如何正确地将 numpy 数组传递给 Cython 函数?

如何正确传递带有指向函数的指针的数组?