簡體   English   中英

將函數指針插入 QMap (Qt)

[英]Insert function pointer into QMap (Qt)

我正在為 Qt 中的 REST API 創建某種路由器,但在將函數指針插入 QMap 時遇到了問題。

我有派生其他模塊的IModule類。 IModule.h重要行是

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

class IModule : public QObject
{
   Q_OBJECT

  protected:
    QMap<QString , IBusAction > *m_actions;

然后我有從IModule派生的UserModule ,在.cpp文件中我有以下UserModule行:

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*))'

我花了幾個小時解決這個問題,嘗試了很多不同的方法來解決它,但沒有成功。

所以我會很高興得到任何建議。

您的IBusAction是指向函數的指針類型。 這與指向成員函數的指針不兼容。

當你調用一個成員函數(比如你的UserModule::create函數)時,它需要一個額外的(“不可見”)參數:函數被調用的實例( this指針)。

您基本上有三個選擇:

  • IBusAction更改為IBusAction成員函數的UserModule 盡管如此,您只能使用該類的功能。

     typedef QByteArray* (UserModule::*IBusAction)(IBus * , ProxyRequest *);
  • 使函數static (這會更改代碼的語義)

  • 使用獨立函數(頂級,不是類的成員)而不是成員函數。

在 C++ 中指向成員函數的指針通常比它的價值更麻煩。 明智的選擇是使用類而不是方法,並保留指向實例的指針而不是方法。

Qt 特定的替代方法是使用基於 QObject 的類的可調用方法,您可以通過字符串名稱調用它,使用 QObject::invokeMethod,繞過許多類型問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM