2013-12-13 70 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指針。