指向成员函数的指针,作为全局函数的参数
Pointer to member function for as argument for global function
有这样的代码:
void foo(void (*fun_ptr)()){
}
class B{
public:
B(){
foo(some_fun);
}
void some_fun(){}
};
编译错误:
error: argument of type ‘void (B::)()’ does not match ‘void (*)()’
在这种情况下如何指向成员函数?我不能更改函数foo的声明,只能更改类B的声明!
声明B::some_fun()
为static
,因为有一个隐式的this
指针作为参数传递给成员函数。注意,将B::some_fun()
设置为静态会阻止对B
的非公共非静态成员的访问。
这是一个常见问题解答。
除了将成员函数包装在一个静态函数中,并以某种方式告诉它调用该方法的对象实例之外,没有其他解决方案:
struct X { void foo(); }
void take_callback(void (*fun_ptr)())
{
fun_ptr(); // invoke callback
}
//wrap the method
X* instance = 0;
void wrap_memberfun()
{
if (instance) instance->foo(); // delegate
}
int main()
{
X x;
take_callback(&X::foo); // doesn't compile
// workaround:
instance = &x;
take_callback(&wrap_memberfun);
}
some_fun()是一个成员函数,需要一个对象。将some_fun()设置为静态。
static void some_fun() {};
调用非静态成员函数需要两个指针(函数和类实例),因此在期望指针指向函数的地方不能真正使用指向非静态成员的指针。
相关文章:
- 内联函数中具有内部链接的全局变量
- 为什么虚函数不能是静态的和全局的?
- 如何在信号处理程序和普通函数中对全局变量进行互斥读写操作
- 全局作用域中函数指针的赋值
- 在命名空间中使用全局命名空间中的函数
- C++ 在编译时具有函数计算全局变量
- 在具有全局类型def的类中使用成员函数指针
- 修改程序的入口点时未调用全局变量的构造函数
- 从函数中全局删除并重新实例化数组结构,而无需在编译时知道数组的大小
- 尝试更改 main 函数内的全局变量值时出现编译错误 C++.
- 赋予全局变量而不是局部变量优先级的函数 - (异常行为)
- 全局函数参数
- std::线程不是全局变量,但在到达创建它的函数的末尾时不会超出范围?
- 初始化与函数输入相关的全局数组
- 删除全局隐式函数 - 避免使用不明确的运算符
- 如何在全局变量的构造函数之前运行函数
- 如何定义全局函数指针并分配给特定地址
- 越界成员函数定义是否需要一个完全限定的类名,直到全局范围
- 在函数中用不同的名称引用全局向量
- 如何在一个结构体中为多个函数全局存储数据