将函数指针插入QMap(Qt)

时间:2012-11-11 11:46:24

标签: c++ qt function-pointers qmap

我在Qt中为REST API创建了一种路由器,我遇到了将函数指针插入QMap的问题。

我有一个类IModule,其他模块可以从中派生出来。 IModule.h的重要行是

typedef QByteArray* (*IBusAction)(IBus * , ProxyRequest *);

class IModule : public QObject
{
   Q_OBJECT

  protected:
    QMap<QString , IBusAction > *m_actions;

然后我UserModule来自IModule.cpp文件中我有这些行:

QByteArray* UserModule::create(IBus *bus, ProxyRequest *req)
{
}

QByteArray* UserModule::show( IBus *bus, ProxyRequest *req)
{
}


UserModule::UserModule(QObject *parent) :
IModule(parent)
{

    // register functions
    m_actions->insert("show", &UserModule::show);
    m_actions->insert("create", UserModule::create);

}

所以我尝试了两个选项如何将函数放在QMap中,引用符号也没有它,但两者都不起作用。我收到错误:no matching function for call to 'QMap<QString, QByteArray* (*)(IBus*, ProxyRequest*)>::insert(const char [5], QByteArray* (UserModule::*)(IBus*, ProxyRequest*))'

我花了几个小时解决这个问题,尝试了很多不同的方法如何解决它但没有成功。

所以我会很乐意接受任何建议。

2 个答案:

答案 0 :(得分:2)

您的IBusAction是指针到函数类型。这与指向成员的函数不兼容。

当你调用一个成员函数(比如你的UserModule::create函数)时,它需要一个额外的(“不可见”)参数:调用函数的实例(this指针)。

您基本上有三种选择:

  • IBusAction更改为指向成员的指针功能 - UserModule。尽管如此,你只能使用这个类的功能。

    typedef QByteArray* (UserModule::*IBusAction)(IBus * , ProxyRequest *);
    
  • 创建函数static(这会更改代码的语义)

  • 使用独立功能(顶级,而非成员)而不是成员功能。

答案 1 :(得分:0)

使用C ++中的成员函数指针通常比它的价值更麻烦。 Sane的替代方法是使用类而不是方法,并将指针保持为实例而不是方法。

Qt特定的替代方法是使用基于QObject的类的可调用方法,您可以使用QObject :: invokeMethod通过字符串名称调用,侧面执行许多类型问题。