如何正确简洁实现类成员调用Sketch自定义函数(函数指针传参)
正确且最简单的实现方式
看起来你想让foo类的成员函数调用自定义的myBar函数,现在的代码有几个小细节需要调整,我给你两种最简单的实现方案,按需选择就行:
方案1:直接调用时传入函数指针(最灵活)
这种方式不需要给类加额外成员,每次调用bar时指定要触发的函数,适合需要动态切换目标函数的场景。
首先修正foo类,明确函数指针的匹配类型,并且把bar设为public(不然外部代码没法访问):
class foo { public: // 定义与myBar完全匹配的函数指针参数 void bar(void (*funcPtr)(char*)) { funcPtr("xxx"); // 调用传入的自定义函数 } };
然后在Sketch里创建foo实例,调用bar时传入myBar:
// 创建全局的foo实例,方便后续随时调用 foo myFoo; void setup() { Serial.begin(9600); // 初始化串口(如果需要打印输出的话) myFoo.bar(myBar); // 触发bar,传入你的自定义函数 } void myBar(char* arg) { // 这里写你的业务逻辑,比如打印参数 Serial.println(arg); }
方案2:让类实例持有函数指针(调用更简洁)
如果你希望这个foo实例固定调用myBar,不用每次传指针,可以给类加一个成员变量存储函数指针,通过构造函数初始化:
修改后的foo类:
class foo { private: // 存储目标函数指针的成员变量 void (*m_targetFunc)(char*); public: // 构造函数,传入函数指针完成初始化 foo(void (*funcPtr)(char*)) : m_targetFunc(funcPtr) {} void bar() { // 加空指针检查,避免传入无效指针导致程序崩溃 if (m_targetFunc != nullptr) { m_targetFunc("xxx"); } } };
Sketch部分:
// 全局创建foo实例,构造时直接传入myBar foo myFoo(myBar); void setup() { Serial.begin(9600); myFoo.bar(); // 直接调用bar,无需再传函数指针 } void myBar(char* arg) { Serial.println(arg); }
几个关键注意点:
- 函数指针的类型必须完全匹配:
myBar是void(char*)类型,所以指针必须定义成void (*)(char*),参数、返回值都不能错; - 类的成员函数(比如
bar)一定要设为public,否则外部代码无法访问; - Arduino环境中建议全局创建类实例,不要在
setup里创建临时对象(临时对象会在setup结束后销毁,后续无法使用); - 加上空指针检查可以避免程序因传入无效指针而崩溃。
内容的提问来源于stack exchange,提问作者Bob Jones
相关产品推荐
相关产品推荐

