我有一些第三部分代码:
class A(){
public:
void assingOnClickFunction(void (*function)();
};
我无法更改该代码中的任何内容。
我想传递给A::assingOnClickFunction()
我的B类方法void B::someFunction()
。我试过了(B类的所有里面!):
a->assingOnClickFunction(this->someFunction);
但我收到错误:
函数调用缺少参数列表;使用'& B :: someFunction'来创建 指向成员的指针
所以我把它改成了:
a->assingOnClickFunction(&B::someFunction);
但现在有不同类型的错误:(void(*)()
和(&B::*)()
我无法使B::someFunction()
静态(它使用了很多非静态B
的成员和方法)!
所以,可以选择将我的 B::someFunction()
传递给 A::assingOnClickFunction()
,而不是将其更改为静态而不更改{ {1}}类(A
不是,也不知道A
,B
包含B
)?
答案 0 :(得分:3)
如果您要传递的成员函数不是static
,则不能这样做。 A
中的方法接受一个没有参数的函数的函数指针,非静态成员函数有一个隐式的this
指针参数。
答案 1 :(得分:2)
为了调用对象的(非静态)方法,您需要知道要调用的对象和方法。
assingOnClickFunction()函数只接受一个指向函数的指针,因此你无法传递所需的信息。
除了一些可怕的黑客攻击,比如实现一个可以访问对象的某个全局实例的函数,然后调用该方法,它就无法完成。
答案 2 :(得分:1)
指向成员函数的指针是不是指向函数的指针。如果你有一个函数接受一个类型为指向函数的参数,你不能用成员函数指针调用它。