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

C++ 在C+中传递成员函数指针+;,c++,qt,member-function-pointers,C++,Qt,Member Function Pointers,我正在尝试将函数指针(类型为QScriptEngine::FunctionSignature(=QScriptValue(QScriptContext*,QScriptEngine*))传递给其他函数。但是我需要传递的函数是一个类的成员函数 我是这样使用它的: class MyClass { SomeVarType someVarINeedAccessTo; QScriptValue print(QScriptContext* context, QScriptEngine* e

我正在尝试将函数指针(类型为
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);
    }
};
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();
 }
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));
    }
};
在这个例子中,我得到了一个错误:

错误:对QScript引擎::newFunction()的调用没有匹配的函数
注:候选人是:…

如何将打印函数传递给newFunction

编辑:

我是这样修复的:

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);
    }
};
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();
 }
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));
    }
};
class-MyClass
{
公众:
...
类别引擎:公共QScript引擎
{
公众:
MyClass*实例;
};
静态QScript值打印(QScript上下文*上下文,QScript引擎*引擎);
void someFunction();
...
};
Myclass::someFunction()
{
发动机;
...
QScriptVaue printFunction=engine.createFunction(打印);
engine.globalObject().setProperty(“打印”,printFunction);
...
}
QScript值MyClass::print(QScript上下文*上下文,QScript引擎*引擎)
{
发动机*发动机=动态铸件(发动机);
工程->实例->剂量测量(…);
返回引擎->取消定义值();
}

尝试限定标识符:

QScriptValue printFunction =
    engine.newFunction(&MyClass::print);
编辑:

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

QScriptValue printFunction =
    engine.newFunction(boost::bind(&MyClass::print, this, _1, _2));

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

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

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);
    }
};
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();
 }
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()。

这不起作用,因为函数不是方法,因此签名不同。相对于其他语言,在C++中,一个方法不绑定到一个对象,因此它作为一个方法的签名,需要应用于一个对象。 您应该做的是包装一个具有良好签名的适当函数(或静态函数),并在作为参数传递的对象上调用所需的方法

MyClass:公共QScript引擎{
静态QScript值静态打印(QScript上下文*上下文,QScript引擎*引擎)
{
MyClass*my_引擎=动态_转换(引擎)
我的引擎->打印(上下文);
}
//重新定义print以仅接受一个参数。
}


也许您希望将_类作为上下文的属性传递,而不是作为引擎传递,但这就是想法。你需要一个静态包装器来在你的方法中的某个地方,在这个参数中,你的函数在上面应用。

< P>不幸的是,C++中没有办法传递一个成员函数,在那里函数是一个正则函数指针。 指向成员函数的指针不是函数指针,只能与对象指针结合使用

您必须编写一个静态函数,并从“其他地方”获取指向MyClass对象的指针:

  • 有没有一种方法可以将指向对象的指针存储到QScript引擎或QScript上下文对象的某些“用户数据”或“上下文”字段中,这些对象将被传递给函数?阅读文档以了解Qt开发人员是否对您很好

  • 使用全局std::map将一个MyClass对象与每个QScript引擎相关联

  • 如果您关心性能,而不关心可移植性,了解调用约定是什么,请查看开源libffi库(http://sourceware.org/libffi/),它允许您在运行时构造函数指针。对于一般的Qt应用程序来说,这是一种过度杀伤力


  • 我得到
    错误:没有匹配的函数用于调用QScript引擎::newFunction(QScript值(MyClass::*)(QScript上下文*,QScript引擎*)
    ,这意味着您的
    QScript引擎::newFunction
    方法未接受正确的函数签名。这是什么定义?就像我发布的:
    QScriptValue(QScriptContext*,QScriptEngine*)
    @VDVLeon:sharth正在请求
    newFunction
    方法的签名。我的坏,sry。但是它是:
    QScriptValue-QScriptEngine::newFunction(FunctionSignature-fun,int-length=0)
    setProperty是Qt库的函数。我不想更改…@VDVLeon的代码:嗯,这确实让我更具挑战性。我没有太多的Qt经验。setProperty()的第二个参数是QVariant,因此您可以说服它存储对绑定函数的某种引用。看来您对@mb14的解决方案很满意,祝您有愉快的一天!如果您还没有遇到过这样的链接,那么有可能会有帮助:有没有登记C++函数的方法,它使用成员值,即非<代码>引擎< />?类似于使用外部对象重定向输入的打印。