将函数指针传递给 class 对象

Pass a function pointer to a class object

我需要能够为 class 指定一个函数,以便能够 运行(回调函数?)作为菜单系统的一部分,我对 C++ 的了解在这里得到了扩展.显然这不会编译,但希望它能让我了解我正在尝试做什么 -

void testFunc(byte option) {
  Serial.print("Hello the option is: ");
  Serial.println(option);
}

typedef void (*GeneralFunction)(byte para);
GeneralFunction p_testFunc = testFunc;

class testClass {
    GeneralFunction *functionName;
  public:
    void doFunction() {
      functionName;
    }
};

testClass test { *p_testFunc(123) };

void setup() {
  Serial.begin(9600);
  test.doFunction();
}

void loop() {
 
}

我知道一些 std:: 选项,但不幸的是 Arduino 没有实现它们。

编辑:此代码的编译器输出 -

sketch_mar10a:17:29: error: void value not ignored as it ought to be

 testClass test { *p_testFunc(123) };

                             ^

sketch_mar10a:17:35: error: no matching function for call to 'testClass::testClass(<brace-enclosed initializer list>)'

 testClass test { *p_testFunc(123) };

                                   ^

请找到下面的代码,看看是否有帮助,你需要一个构造函数来获取参数,而且你不能从参数列表中调用函数,同时它需要一个函数指针

#include <iostream>

using namespace std;

void testFunc(int option) {
  std::cout<<"in fn "<<option;
}

typedef void (*GeneralFunction)(int para);
GeneralFunction p_testFunc = testFunc;

class testClass {
    GeneralFunction functionName;
    int param1;
  public:
    testClass(GeneralFunction fn,int par1):functionName(fn),param1(par1){}
    void doFunction() {
      functionName(param1);
    }
};

testClass test (p_testFunc,123);

void setup() {
  test.doFunction();
}

void loop() {

}


int main()
{
    setup();
    return 0;
}

感谢 Bibin,我调整了他的代码以适应 Arduino,分离了构造函数,并在 setup() 中初始化了 class。

void testFunc(byte option) {
  Serial.print("Hello the option is: ");
  Serial.println(option);
}

typedef void (*GeneralFunction)(byte para);
GeneralFunction p_testFunc = testFunc;

class testClass {
    GeneralFunction functionName;
    byte param1;
  public:
    testClass(GeneralFunction fn, int par1);
    void doFunction() {
      functionName(param1);
    }
};

void setup() {
  Serial.begin(9600);
  testClass test (p_testFunc, 123);
  test.doFunction();
}

void loop() {
}

testClass::testClass(GeneralFunction fn, int par1)  //constructor
  : functionName(fn), param1(par1) {}

输出:

Hello the option is: 123