2016-05-15 89 views
1

我有使用Borland C++编译器在Eclipse,我想一个成员函数的地址传递给另一个类的构造函数是第一类的朋友问题C++通过构件函数作为另一个的成员函数的参数

PCB::PCB(Thread *t, long stack, int time, void (*method)()) 

我使用的方法找到FP_SEGFP_OFF,但它给我的错误,当我写

Thread::Thread (StackSize stackSize, Time timeSlice){ 
    myPCB = new PCB(this, stackSize, timeSlice, run); 
} 

这是错误,我让所有的时间:

找不到函数线程一次比赛为 'PCB :: PCB(螺纹* const的无符号长,无符号整型,无效)' ::线程(无符号长,无符号整型)

+0

'void(* method)()'不是成员函数指针。 –

+0

但是,当我添加(Thread :: *方法)FP_OFF(方法)不起作用 – Brana

+0

我建议阅读此答案http://stackoverflow.com/a/7218633/5404527 – o9000

回答

4

虽然成员函数调用看起来像是一个常规的函数调用,但两者并不相同,因为在将指针传递给被调用的函数时存在编译器技巧。当您从另一个成员函数调用成员函数时,C++会为您填充this指针。这就是为什么成员函数与常规函数不兼容,只有静态函数。

如果您需要将函数传递给您未写入的API,则需要传递常规函数。否则,请考虑更改代码以代替std::function,因为它与成员函数兼容。

有时,第三方C风格的API支持为呼叫的“上下文”传递额外的参数。如果您的API也支持void*,那么您可以编写一个常规函数,该函数将一个void指针转换回您的类的实例,并在该实例上调用成员函数。

相关问题