2013-12-13 72 views
0

我有方法传递对象的方法函数指针接受[静态方法指针/全局函数]指针

typedef void 
(* JSErrorReporter)(JSContext *cx, const char *message, JSErrorReport *report); 

JS_SetErrorReporter(JSContext *cx, JSErrorReporter er); 

我想传递对象的方法,而不是静态的方法

JS_SetErrorReporter(cx,this->Reporter);//Failed ! 

那里记者是对象的方法(不是静态的)

JS_SetErrorReporter(cx,Reporter); //Passed 

其中报告者是静态方法,dec LARE作为

static void SomeClass::reportError(JSContext *cx, const char *message, JSErrorReport *report) 
+0

使用'&SomeClass :: reportError'然后,'this-> Reporter'就是错误的语法(即使是成员函数指针)。无论如何,静态方法不知道“this”。 –

+3

你可以做的是提供一个静态方法,它从某种程度上从上下文获取'this'指针。我不知道'JSContext'是否提供了一些'void * userData;'成员,可以用于这个。 –

回答

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使用你。

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]

  • 但RichardPlunkett概述__closure它仅仅是为Borland/Embarcadero的编译器
  • 为VC/GCC /英特尔编译器...你需要一个解决办法
  • 有一些在那里。
  • 它看起来像人们喜欢的东西叫Boost库
  • 在这里,我找到了__closure模拟http://www.rsdn.ru/forum/cpp/3078740.flat
  • 一个例子用俄语,但源代码,甚至对我们azbuka非读者很清楚...
+1

这是一个编译器特定的扩展不是吗? – RichardPlunkett

+0

如果你是对的我认为这是理所当然的,因为我主要在borland编码,所以我没有想到:(http://objectmix.com/c/398370-how-translate-__closure-into-pure-c。 HTML – Spektre

0

你不能直接做。因为调用一些非静态函数,你必须有this指针,但你不把它传递给JS_SetErrorReporter功能。

两个可能的解决方案:

  1. 变化JSErrorReporter签名接受void *类型的+1参数,并通过this指针那里。

  2. 创建一个包装函数作为一个全球性的功能,那也知道需要this指针。