我有方法
typedef void
(* JSErrorReporter)(JSContext *cx, const char *message, JSErrorReport *report);
JS_SetErrorReporter(JSContext *cx, JSErrorReporter er);
我想传递object的方法而不是静态方法
JS_SetErrorReporter(cx,this->Reporter);//Failed !
其中Reporter是对象的方法(非静态)
JS_SetErrorReporter(cx,Reporter); //Passed
其中Reporter是静态方法,声明为
static void SomeClass::reportError(JSContext *cx, const char *message, JSErrorReport *report)
答案 0 :(得分:1)
你想使用成员函数指针,你必须得到正确的语法,(不是微不足道的) 对于一个无聊的函数,获取并返回一个int,即:
声明变量(也适用于参数):
int (SomeClass::*my_memfunc_ptr)(int);
分配变量:
my_memfunc_ptr = &SomeClass::some_member_func;
主叫:
SomeClass *x = new SomeClass;
int n = (x->*my_memfunc_ptr)(6);
我将这个适应你的非int用途。
答案 1 :(得分:0)
完全避免静态函数很容易使用 __ closure 函数指针代替:
//---------------------------------------------------------------------------
class C2
{
public:
void callback1() {} // your member function to pass to ...
};
class C1 // some class with member function pointer usage
{
public:
void (__closure *callback1)(); // member function pointer
C1() { callback1=NULL; } // constructor
void do_something() // some function with use of callback1
{
if (callback1) callback1();
}
};
void some_function(void (__closure *f)()) // some function with member function parameter usage
{
if (f) f();
}
void main()
{
C1 c1;
C2 c2;
c1.callback1=c2.callback1;
c1.do_something();
some_function(c1.callback1);
some_function(c2.callback1);
}
//---------------------------------------------------------------------------
[编辑1]
答案 2 :(得分:0)
你不能直接这样做。因为要调用某些非静态函数,您必须使用this
指针,但不要将其传递给JS_SetErrorReporter
函数。
两种可能的解决方案:
将JSErrorReporter
签名更改为接受void *
类型的+1参数,并在其中传递this
指针。
创建一个包装函数作为全局函数,它也知道所需的this
指针。