Не могу сохранить указатель на функцию c++ qt
у меня есть функция, которую надо сохранить в указателе. Работаю в QT, во время компиляции генерирует ошибку. Может кто помочь? Код следующий:
pclCloudFilter::pclCloudFilter(QObject *parent) : QObject(parent)
{
void (*t_func)();
t_func = &pclCloudFilter::custt;
}
void pclCloudFilter::custt()
{
qDebug() << "class pclCloudFilter get clouds";
}
Ответы (1 шт):
Если void pclCloudFilter::custt() не объявлена как static, то указатель на неё должен быть типа указатель на член-функцию, как уже ответил @KoVadim в комментарии:
void (pclCloudFilter::*t_func)();
Обычный указатель на функцию не годится, т.к. кроме явных параметров функции, в неё ещё неявно передаётся текущий экземпляр класса this. (void (*t_func)(pclCloudFilter*); тоже не подойдёт, this передаётся хитрее, чем просто параметр)
Указатель на член-функцию используется с операторами .* и ->*, вызов будет выглядеть так:
void (pclCloudFilter::*t_func)();
...
pclCloudFilter* inst = ...;
...
(inst->*t_func)();
Ужасная конструкция. Обычно с таким не имеют дело напрямую.
Используют:
std::mem_fnдля превращения указателя на член-функцию в функторstd::bind,std::bind_front,boost::bindтоже для превращения указателя на член-функцию в функтор, плюс для захватаthisи/или другого контекста- лямбды - для коротких обёрток вызова члена-функции (при этом указатель на член-функцию вообще не нужен)
- Обобщённый объект функции
std::functionилиboost::functionдля хранения любого функтора со стиранием типа - сигналы
Boost.Signals2, Qt slot/signals для реализации паттерна "обозреватель"
