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

时间:2013-12-13 10:54:09

标签: c++ pointers methods casting

我有方法

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) 

3 个答案:

答案 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]

  • 但正如RichardPlunkett概述__closure它仅适用于borland / embarcadero编译器
  • 对于VC / GCC / Intel ...编译器,您需要一种解决方法
  • 那里有一些。
  • 看起来人们更喜欢叫做升级库的东西
  • 在这里我找到了一个__closure模仿http://www.rsdn.ru/forum/cpp/3078740.flat
  • 的例子
  • 它的俄文版,但源代码非常清楚,即使对于我们azbuka非读者......

答案 2 :(得分:0)

你不能直接这样做。因为要调用某些非静态函数,您必须使用this指针,但不要将其传递给JS_SetErrorReporter函数。

两种可能的解决方案:

  1. JSErrorReporter签名更改为接受void *类型的+1参数,并在其中传递this指针。

  2. 创建一个包装函数作为全局函数,它也知道所需的this指针。