C++静态成员函数作为C回调函数需要访问非静态引用
C++ static member function as C callback needs to access non static reference
在我的C++代码中,我依赖于C库。这个C库允许我定义一个带有3个参数的回调。示例:
文件.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* 2, argument* 3);
static void my_callback(argument* 1, argument* 2, argument*3);
MyClass.cpp:
MyClass::MyClass(){
set_callback(ARG1, my_callback);
}
void MyClass::my_function(argument*1, argument* 2, argument* 3){
/* Do something */}
void MyClass::my_callback(argument* 1, argument* 2, 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* two, 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设置为您的对象,就可以开始了。
假设没有并发问题(我不知道是不是这样),更简单的解决方案可以是定义一个静态实例并在静态函数中使用它。
像这样的东西。
MyClass.h
class Object;
class MyClass
{
public:
MyClass();
static Object* object;
static void callback();
~MyClass();
};
MyClass.cpp
Object* MyClass::object;
MyClass::MyClass()
{
object = new Object();
}
void MyClass::callback() {
object->sayHello();
}
MyClass::~MyClass()
{
delete object;
}
相关文章:
- 使用不带参数的函数访问结构元素
- 删除目录函数访问被拒绝
- 给定一个C++嵌套的私有结构类型,是否有从文件范围静态函数访问它的策略
- 如何使用 C++ 中的继承函数访问派生类中的局部变量
- 我想要一个具有子函数的函数访问相同的命名函数,而不使用它取决于其子类的类
- 有没有办法通过 main 函数访问受保护的矢量大小而无需将其转换为公共?
- 如何在C++通过公共函数访问私有函数成员?
- 限制variadic模板类中的构造函数访问
- 从析构函数访问模板类构造函数的参数,可以吗?
- 变量 z 无法从其他函数访问变量 x
- 从静态成员函数访问私有非静态类变量 - C++
- 如何在 C++ 中从 void 返回函数访问变量
- 在类中使用映射并通过其他类的 get() 和 set() 函数访问值
- 无法从另一个函数访问文件范围变量的内容
- 是否可以从 C++ 中的构造函数访问对象名称?
- 使用C 中的共享_ptr从公共静态成员函数访问私有构造函数
- 使用静态成员函数访问静态数据成员
- 为什么我们可以从 C++ 中的成员函数访问 non_member 函数
- 如何使用 c++ 中的函数访问全局变量?
- 如何从 C++ 中的主函数访问类中的私有构造函数?