2013-02-05 64 views
-1

我有一些第3部分代码:如何使用指向方法的指针作为参数(何时需要指向函数的指针)?

class A(){ 
    public: 
     void assingOnClickFunction(void (*function)(); 
}; 

我不能改变任何东西代码。 我想通过那个A::assingOnClickFunction()我的方法B类,void B::someFunction()。我已经试过(全部内的B级!):

a->assingOnClickFunction(this->someFunction); 

但我得到的错误:

function call missing argument list; use '&B::someFunction' to create a pointer to member

所以我把它改为:

a->assingOnClickFunction(&B::someFunction); 

但现在有关于不同类型的错误:(void(*)()(&B::*)()

我不能让B::someFunction()静态(它使用了很多非静态的B的成员和方法)!

所以,是否有一个选项传递我B::someFunction()A::assingOnClickFunction(),而不是将其改为静态和A类不改变任何东西(A是不是,也不可能知道BB包括A

+0

您想传递'static'的成员函数吗? –

+0

正如我写的,它不是静态的,我不能将它改变为静态。 – PolGraphic

+0

尝试它给出了一个错误:'类型转换':不能从'void(__thiscall B :: *)(void)'转换为'void *' – PolGraphic

回答

3

如果您想要传递的成员函数不是static,则不能这样做。 A中的方法接受函数指针,指向不带参数的函数,而非静态成员函数具有隐含的指针参数this

1

指向成员函数的指针是而不是指向函数的指针。如果您有一个函数使用参数类型为函数指针的函数,那么不能使用指向成员函数的指针进行调用。

2

为了调用对象的(非静态)方法,您需要知道要调用的对象和方法。

assingOnClickFunction()函数只接受一个指向函数的指针,所以你不能传递它所需的信息。

除了一些可怕的黑客攻击之外,像实现一个可以访问对象的某个全局实例的函数,并调用该方法,无法完成。

+0

的确,我正在考虑像'黑客'这样的事情。但我想我应该重建我的代码并以其他方式创建它(这对于访问它的全局实例和函数来说看起来非常可怕)。 – PolGraphic

相关问题