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引擎::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++函数的方法,它使用成员值,即非<代码>引擎< />?类似于使用外部对象重定向输入的打印。