在C ++中传递成员函数指针 [英] Pass member function pointer in 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屋!