我试图将一个函数指针(类型为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);
}
};在这个例子中,我得到了错误:
error: no matching function for call to QScriptEngine::newFunction(<unresolved overloaded function type>) note: candidates are: ...
如何将打印函数传递给newFunction?
编辑:
我把它修好了:
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();
}发布于 2010-11-23 15:14:49
这不起作用,因为函数不是一个方法,因此签名是不同的。与其他语言不同的是,在C++中,方法不绑定到对象,因此它是方法的签名,需要应用于对象。
您应该做的是包装一个正确的函数,这个函数(或静态函数)具有良好的签名,并调用作为论证传递的对象上所需的方法。
喜欢
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作为上下文的属性传递,而不是作为引擎,但这就是想法。您需要对您的方法使用静态包装器,在参数中的某个位置使用对象来应用您的函数。
发布于 2010-11-23 14:54:34
尝试对标识符进行限定:
QScriptValue printFunction =
engine.newFunction(&MyClass::print);编辑:
正如我看到函数的声明一样,您必须按照其他建议使用boost::bind:
QScriptValue printFunction =
engine.newFunction(boost::bind(&MyClass::print, this, _1, _2));boost::bind将方法和要调用的对象(this)转换为可以在对象上调用该方法的对象。
发布于 2010-11-23 15:08:50
仅仅传递成员函数引用可能存在的问题是,成员函数需要一个对象实例来执行。如果是这样的话,请看一下Boost.bind,特别是这部分。假设您希望MyClass类型的当前对象使用print()方法,您可能需要如下所示:
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()。
https://stackoverflow.com/questions/4257239
复制相似问题