Функция вызывается в классе, ей передается указатель на метод.
timer (300, &Myclass::Func);
Передается, вроде, правильно. Но при вызове ничего не происходит. Понимаю, что без объекта вызов не имеет смысла, но как решить проблему?
void timer (float diff, void (Myclass::*ptrFunc) ()) // не является членом класса
{
static clock_t t1=clock (), t2;
t2=clock ();
if ((float)t2-(float) t1>=diff)
{
ptrFunc;
t1=clock ();
}
}
Метод который должен сработать (находится в Myclass)
void Func ()
{
cout<<"Func
";
}
Ответ
Вы не вызываете функцию. ptrFunc; — это не вызов (в отличие от Паскаля). Это просто тривиальное арифметическое выражение, результат которого не используется, и поэтому игнорируется. Точно так же вы могли бы написать
14;
Существуют разные методы справиться с проблемой.
Вы должны каким-то образом передать экземпляр класса, у которого функция будет вызываться. Это старый способ, должен работать на практически всех компиляторах.
Вы можете использовать std::function в принимающий функции. Чтобы построить std::function из функции-члена, можно использовать std::bind, чтобы «подшить» экземпляр класса к функции. Или применить обычную лямбду.
Пример:
#include
class C
{
public:
void func() { std::cout << "I'm C::func()" << std::endl; }
};
typedef void (C::*ptrFunc)();
void call1(C* pC, ptrFunc f)
{
(pC->*f)();
}
void call2(std::function
int main()
{
C c;
call1(&c, &C::func);
call2(std::bind(&C::func, &c));
call2([&c]() { c.func(); });
return 0;
}
(проверка)
Обратите внимание, что на момент вызова переданной функции исходный объект (на котором функция будет вызываться) обязан существовать, и забота об этом лежит исключительно на программисте (то есть, на вас).
Комментариев нет:
Отправить комментарий