首页 > 解决方案 > 如何通过引用另一个需要具有相同参数和相同返回的函数的库函数来传递对象函数

问题描述

我有一个我真正问题的例子。我使用了一个 C 库,它有一个需要稍后调用的指针函数的函数。但我需要那个调用是一个对象函数,但我不能这样做:

class MyClass{
  static int numberObjects; 
  //...
public:
  MyClass(int num){
    numberObjects++;
    //...
  }
  void myFunction(int num){
    //...
  } 
};
int MyClass::numberObjects = 0;


void functionExtern(int number){
  //...
}

void functionLibrary(void (* f)(int)){
  //...
  int arg;
  f(arg);
}

typedef void (MyClass::* pointerMyClassFunction)(int x);
typedef void (* functionPattern)(int x);

这工作正常:

int main(int argc, char** argv) {
    
  MyClass class1(10);
  MyClass class2(20);
   
    
  class1.myFunction(100);
  class2.myFunction(200);
    
    
  functionExtern(4);
  functionLibrary(functionExtern);

}

当我尝试这样做时,我有一个错误:

functionLibrary(class1.myFunction);
functionLibrary(&class2.myFunction);

我也试过这个,但它不起作用:

functionLibrary((functionPattern)(class1.*(MyClass::myFunction)));

这段代码是对实际问题的简化。该库是一个 TIRTOS 库,用于在德州仪器的 RTOS 中创建任务。它需要一个函数,任务(线程)在哪里,但一切都是由对象管理的。然后,当您创建一个新对象时,这可能会创建一个新任务,依此类推。然后,当您调用 Task_Construct (函数库需要一个指针函数的参数)时,这需要一个指针函数,但我想传递一个带有自己的任务(线程)的对象函数。参数是:taskStruct,(线程的数据结构)pointerFunction,(线程的回调)taskParams,(配置线程的另一个数据结构)errorBlock,(当您想要管理它们时,是另一个用于注册错误的结构)这个Task_Construct相当于我的 functionLibrary 示例,它的原型是下一个:

#define Task_construct ti_sysbios_knl_Task_construct

void ti_sysbios_knl_Task_construct(ti_sysbios_knl_Task_Struct *__obj, ti_sysbios_knl_Task_FuncPtr fxn, const ti_sysbios_knl_Task_Params *__paramsPtr, xdc_runtime_Error_Block *__eb )

ti_sysbios_knl_Task_FuncPtr fxn 相当于我的 functionLibrary 的“void (* f)(int)”参数。它的原型是下一个:

typedef xdc_Void (*ti_sysbios_knl_Task_FuncPtr)(xdc_UArg, xdc_UArg);

和参数:

#define xdc_Void        void
typedef uintptr_t       xdc_UArg;
typedef unsigned int    uintptr_t;

我试图简化这一点,本质上我有一个名为“functionLibrary”(Task_construc)的“C”函数,它需要一个等效于 typedef xdc_Void(*ti_sysbios_knl_Task_FuncPtr)的“C 指针函数”(void (*f)(int)) )(xdc_UArg, xdc_UArg) 但是,如果我使用这种类型的函数创建一个对象并尝试将其传递给函数,则会出现错误,因为我不知道如何更改它:

void MyClass::myFunction(int) 

为了这:

void functionExtern(int)

因此我可以通过 &functionExtern 但我不能通过 &myObject.myFunction

标签: c++

解决方案


要调用成员函数需要一个对象,但您的 C 函数允许您传递一个int,而不是void*您可以使用它来传递指向该对象的指针。因此,您需要将其int用作指向对象的全局指针数组的索引以定位对象:

MyClass* objects[2];

void callback(int idx) {
    objects[idx]->myFunction(idx);
}

int main() {
    MyClass a(1);
    MyClass b(2);

    objects[0] = &a;
    objects[1] = &b;

    functionLibrary(callback, 0);
    functionLibrary(callback, 1);
}

推荐阅读