【发布时间】:2015-03-01 09:42:55
【问题描述】:
一个感兴趣的 C 标头 (some_external_library.h) 声明了以下 struct,其中包含一个函数指针:
#ifdef __cplusplus
extern "C" {
#endif
typedef struct {
void (*function_ptr)(void);
} fp_test;
/* ... */
#ifdef __cplusplus
}
#endif
当some_external_library.c 中发生一些有趣的事件时,会调用此函数指针。
我想在一个名为Foo的C++class的实例中设置一个指向这个struct实例的指针,然后将function_ptr的值设置为一个非静态的地址使用Foo 的实例函数。换句话说,我希望我的 C++ 代码定义这个函数指针的作用。
例如,这是一个类声明 (foo.h):
class Foo {
public:
fp_test *fp_test_ptr;
void setup(void);
void breakdown(void);
void my_callback(void);
};
共有三个函数:一个用于初始化值的setup 函数,一个用于释放任何指针或对象的breakdown 函数,以及一个简单的my_callback 函数,它不接受和返回任何参数。
这是类定义 (foo.cpp):
int main(int argc, char** argv) {
Foo some_foo;
some_foo.setup();
some_foo.breakdown();
return EXIT_SUCCESS;
}
void Foo::setup(void) {
fp_test_ptr = new fp_test;
fp_test_ptr->function_ptr = &Foo::my_callback;
}
void Foo::breakdown(void) {
delete fp_test_ptr;
}
void Foo::my_callback(void) {
std::fprintf(stderr, "Callback called...\n");
}
当我编译这个时,我得到以下错误:
foo.h:: error: assigning to 'void (*)()' from incompatible type 'void (Foo::*)()'
fp_test_ptr->function_ptr = &Foo::my_callback;
^------------------
我尝试投射此调用,但我收到一条错误消息,指出我无法从类型 void (Foo::*)() 投射到 void (*)()。
如何在 C++ 中将非静态方法设置为指向 C 库的函数指针?
我能够获得Foo::my_callback() 的static 版本来编译,但我认为我不能使用静态方法来满足我的需要,因为我无法访问非全局成员的状态在类实例some_foo中,只有全局成员的值。
有没有办法用非静态函数做到这一点?
【问题讨论】:
-
除非您使用代理,否则它必须是静态的。 C ++就是那样愚蠢。这是由于名称修改造成的。
标签: c++ c pointers function-pointers