首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C++中传递成员函数指针

在C++中传递成员函数指针
EN

Stack Overflow用户
提问于 2010-11-23 14:51:20
回答 4查看 5.5K关注 0票数 2

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

我就是这样用的:

代码语言:javascript
复制
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);
    }
};

在这个例子中,我得到了错误:

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

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

编辑:

我把它修好了:

代码语言:javascript
复制
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();
 }
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-11-23 15:14:49

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

您应该做的是包装一个正确的函数,这个函数(或静态函数)具有良好的签名,并调用作为论证传递的对象上所需的方法。

喜欢

代码语言:javascript
复制
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.

}

也许您希望将your_class作为上下文的属性传递,而不是作为引擎,但这就是想法。您需要对您的方法使用静态包装器,在参数中的某个位置使用对象来应用您的函数。

票数 1
EN

Stack Overflow用户

发布于 2010-11-23 14:54:34

尝试对标识符进行限定:

代码语言:javascript
复制
QScriptValue printFunction =
    engine.newFunction(&MyClass::print);

编辑:

正如我看到函数的声明一样,您必须按照其他建议使用boost::bind

代码语言:javascript
复制
QScriptValue printFunction =
    engine.newFunction(boost::bind(&MyClass::print, this, _1, _2));

boost::bind将方法和要调用的对象(this)转换为可以在对象上调用该方法的对象。

票数 0
EN

Stack Overflow用户

发布于 2010-11-23 15:08:50

仅仅传递成员函数引用可能存在的问题是,成员函数需要一个对象实例来执行。如果是这样的话,请看一下Boost.bind,特别是这部分。假设您希望MyClass类型的当前对象使用print()方法,您可能需要如下所示:

代码语言:javascript
复制
class MyClass
{
    SomeVarType someVarINeedAccessTo;

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

    void someFunction()
    {
        QScriptEngine engine;
        engine.globalObject().setProperty("print", 
           boost::bind(&MyClass::print, this, _1, _2));
    }
};

这可能会导致您稍微重做setProperty()。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4257239

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档