问题如下:考虑这段代码:
#include <iostream>
class aClass
{
public:
void aTest(int a, int b)
{
printf("%d + %d = %d", a, b, a + b);
}
};
void function1(void (*function)(int, int))
{
function(1, 1);
}
void test(int a,int b)
{
printf("%d - %d = %d", a , b , a - b);
}
int main()
{
aClass a;
function1(&test);
function1(&aClass::aTest); // <-- How should I point to a's aClass::test function?
}
如何使用 a
的 aClass::test
作为 function1
的参数?我想访问班级的成员。
原文由 Jorge Leitao 发布,翻译遵循 CC BY-SA 4.0 许可协议
使用函数指针没有任何问题。但是,指向非静态成员函数的指针与普通函数指针不同:成员函数需要在作为隐式参数传递给函数的对象上调用。上面的成员函数的签名是,因此
而不是您尝试使用的类型
一种方法可能包括创建成员函数
static
在这种情况下,它不需要调用任何对象,您可以将其与类型一起使用void (*)(int, int)
。如果你需要访问你的类的任何非静态成员 并且 你需要坚持使用函数指针,例如,因为函数是 C 接口的一部分,你最好的选择是总是传递一个
void*
到您的函数采用函数指针并通过转发函数调用您的成员,该函数从void*
获取对象,然后调用成员函数。在适当的 C++ 接口中,您可能希望查看让函数为函数对象采用模板化参数以使用任意类类型。如果不希望使用模板化接口,您应该使用类似
std::function<void(int, int)>
的东西:您可以为这些创建适当的可调用函数对象,例如,使用std::bind()
。使用类类型的模板参数或合适的
std::function<...>
的类型安全方法比使用void*
接口更可取,因为它们消除了由于强制转换为错误而导致错误的可能性类型。为了阐明如何使用函数指针来调用成员函数,下面是一个示例: