在C ++中传递成员函数指针 [英] Pass member function pointer in C++

查看:80
本文介绍了在C ++中传递成员函数指针的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图传递一个函数指针( QScriptEngine :: FunctionSignature (= QScriptValue(QScriptContext *,QScriptEngine *)))到另一个函数。但我需要传递的函数是一个类的成员函数。



我这样使用:

  class MyClass 
{
SomeVarType someVarINeedAccessTo;

QScriptValue print(QScriptContext * context,QScriptEngine * engine)
{
... someVarINeedAccessTo ...
}

void someFunction ()
{
QScriptEngine engine;
QScriptValue printFunction = engine.newFunction(print);
engine.globalObject()。setProperty(print,printFunction);
}
};在这个例子中,我得到错误:

p> 错误:没有匹配的函数调用QScriptEngine :: newFunction(<未解决的重载函数类型>)
注意:候选是:...
p>

如何将打印函数传递给newFunction?



EDIT: >

我这样修改它:

  class MyClass 
{
public:
...

class TheEngine:public QScriptEngine
{
public:
MyClass * instance;
};

static QScriptValue print(QScriptContext * context,QScriptEngine * engine);

void someFunction();

...
};

Myclass :: someFunction()
{
TheEngine engine;

...

QScriptVaue printFunction = engine.createFunction(print);
engine.globalObject()。setProperty(print,printFunction);

...
}

QScriptValue MyClass :: print(QScriptContext * context,QScriptEngine * engine)
{
TheEngine * eng = dynamic_cast< TheEngine *>(engine);
eng-> instance-> doSomething(...);
return engine-> undefinedValue();
}


解决方案

一个函数不是一个方法,所以签名是不同的。与其他语言相反,在C ++中一个方法不绑定到一个对象,所以它作为一个方法的签名,需要应用于一个对象。



你应该做的是包装一个合适的函数(或一个静态的)与良好的签名,并调用你想要的对象作为argumment传递的对象。



like

  MyClass:public QScriptEngine {
static QScriptValue static_print(QScriptContext * context,QScriptEngine * engine)
{
MyClass * my_engine = dynamic_cast< MyClass>(engine)
my_engine-> print(context);
}

//重新定义print以只接受一个参数。

}



传递your_class作为上下文的属性而不是引擎,但这是想法。你需要一个静态包装器的方法,在参数的某个地方的对象上应用你的函数。


I am trying to pass a function pointer (of type QScriptEngine::FunctionSignature (= QScriptValue (QScriptContext *, QScriptEngine *))) to an other function. But the function I need to pass is a member function of a class.

I use it like this:

class MyClass
{
    SomeVarType someVarINeedAccessTo;

    QScriptValue print(QScriptContext* context, QScriptEngine* engine)
    {
        ... someVarINeedAccessTo ...
    }

    void someFunction()
    {
        QScriptEngine engine;
        QScriptValue printFunction = engine.newFunction(print);
        engine.globalObject().setProperty("print", printFunction);
    }
};

With this example I get the error:

error: no matching function for call to QScriptEngine::newFunction(<unresolved overloaded function type>) note: candidates are: ...

How can I pass the print function to newFunction?

EDIT:

I fixed it like this:

class MyClass
{
    public:
         ...

         class TheEngine : public QScriptEngine
         {
             public:
                  MyClass* instance;
         };

         static QScriptValue print(QScriptContext *context, QScriptEngine *engine);

         void someFunction();

         ...
 };

 Myclass::someFunction()
 {
     TheEngine engine;

     ...

     QScriptVaue printFunction = engine.createFunction(print);
     engine.globalObject().setProperty("print", printFunction);

     ...
 }

 QScriptValue MyClass::print(QScriptContext* context, QScriptEngine* engine)
 {
      TheEngine* eng = dynamic_cast<TheEngine*>(engine);
      eng->instance->doSomething(...);
      return engine->undefinedValue();
 }

解决方案

That doesn't work because a function is not a method and so the signature are different. As opposed to other language, in C++ a method is not bound to an object, so it as the signature of a method and need to be applied on a object.

What you should do is wrap a proper function which (or a static one) with the good signature and call the method you want on the object passed as argumment.

like

MyClass : public QScriptEngine {
  static QScriptValue static_print(QScriptContext* context, QScriptEngine* engine)
  {
    MyClass *my_engine = dynamic_cast<MyClass>(engine)
    my_engine->print(context);
  }

// redefine print to take only one argument.

}

Maybe you would like instead to pass your_class as an attribute of the context rather than being the engine, but that's the idea. You need a static wrapper to your method with somewhere in the argument the object to apply your function on it.

这篇关于在C ++中传递成员函数指针的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆