加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C静态成员函数作为C回调需要访问非静态引用

发布时间:2020-12-16 07:08:30 所属栏目:百科 来源:网络整理
导读:在我的C代码中,我对C库有依赖性.这个C库允许我用3个参数定义一个回调.例: file.c: #ifdef __cplusplusextern "C"{#endif typedef void(*callback)(argument* 1,argument* 2,argument* 3);... void set_callback(ARG1,callback name_of_callback);... 在C库
在我的C代码中,我对C库有依赖性.这个C库允许我用3个参数定义一个回调.例:

file.c:

#ifdef __cplusplus
extern "C"{
#endif
     typedef void(*callback)(argument* 1,argument* 2,argument* 3);
...
     void set_callback(ARG1,callback name_of_callback);
...

在C库我正在开发我希望这个回调是一个类的成员函数,因为我不能直接传递成员函数作为回调到C库我创建了一个静态函数作为回调和在这个静态函数内我希望有一个类对象的引用,并调用其成员函数来完成工作.

现在我的问题是我的静态函数需要有C库指定的3个参数,所以我没有找到一种方法来引用我正在该静态函数内部开发的类的对象.我想做的例子:

MyClass.h:

class MyClass:
public:
   MyClass();
   void my_function(argument*1,argument* 3);
   static void my_callback(argument* 1,argument*3);

MyClass.cpp:

MyClass::MyClass(){
    set_callback(ARG1,my_callback);
}

void MyClass::my_function(argument*1,argument* 3){ 
      /* Do something */}
void MyClass::my_callback(argument* 1,argument*3){
    Object->my_function(1,2,3);
}

不将类成员设置为静态的原因是我希望能够创建和销毁此类的对象以用于测试目的并控制测试中对象的状态.

我正在使用g和gcc,希望有人可以提供一些帮助.
提前致谢.

解决方法

您可以创建静态成员函数或纯’C’函数来执行此操作,请考虑下面的示例:

/**
 * C++ part
 */
class obj
{
public:
    obj() {}
    ~obj() {}

    void doSomething(int a,int b) { cout << "result = " << a+b << endl; }
};

/**
 * C Part
 */
#ifdef __cplusplus
extern "C"
#endif
{
typedef void (*callback)(void* one,void* two,void* three);

callback g_ptr = NULL;
void* arg = NULL;

void c_lib_core (void)
{
    printf ("C Lib core...n");
    if (g_ptr)
    {
        g_ptr(arg,NULL,NULL);
    }
}

void set_callback (void* arg,callback ptr)
{
    g_ptr = ptr;
}

void my_callback (void* one,void* three)
{
    obj* my_obj = (obj*) one;

    my_obj->doSomething(1,2);
}

#ifdef __cplusplus
}
#endif



int main (void)
{
    obj a;

    set_callback (&a,my_callback);

    c_lib_core ();
}

输出:

C Lib core...
result = 3

我将指向C对象的指针作为参数1传递.这允许回调将其强制转换回C并调用它. c_lib_core就是这样我可以模拟回调函数的回调以进行测试.这与全局变量一起将在C代码中的某个地方.你只需要实现一个C函数并将ARG1设置为你的对象,你就可以了.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读