Передача метода класса в другой метод и в QMap, с++
class XM : public QObject
{
Q_OBJECT
public:
explicit XM( QObject *parent = nullptr);
void login();
private:
quint32 counter;
typedef void(XM::*callback)(quint32);
QMap<qint32, callback > commands;
quint32 send(callback cb);
void login_cb();
private slots:
void ready();
};
void XM::login()
{
this->send(&XM::login_cb);
}
quint32 XM::send(callback cb)
{
// тут отправили задачу на сервер
this->commands.insert(this->counter, cb);
this->counter+=2;
}
void XM::ready(quint32 counter, quint32 data)
{
// тут приняли ответ
callback fut = this->commands.take(counter);
fut(data);
}
void XM::login_cb(quint32 data)
{
// тут нужен тот же this, что был в login
qDebug() << data;
}
Вот такой код, если выкинуть всё мясо.
Ошибка
ошибка: called object type 'XM::callback' (aka 'void (XM::*)(quint32)') is not a function or function pointer
Ответы (1 шт):
Автор решения: AR Hovsepyan
→ Ссылка
Для вызова не статического метода нужен объект, поэтому просто пишите так:
void XM::ready(quint32 counter, quint32 data)
{
// тут приняли ответ
(this->*(commands.take(counter)))(data);
}
Во вторых, сигнатуры объявленных методов не соответствуют сигнатуре в определении. В частности XM::login_cb не имеет аргумента, а вы определяете ее как с одним аргументом.То же самое касается и слоту ready. Просто пересмотрите внимательно.