#cpp
Функция вызывается в классе, ей передается указатель на метод. 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\n"; }
Ответы
Ответ 1
Вы не вызываете функцию. ptrFunc; — это не вызов (в отличие от Паскаля). Это просто тривиальное арифметическое выражение, результат которого не используется, и поэтому игнорируется. Точно так же вы могли бы написать 14; Существуют разные методы справиться с проблемой. Вы должны каким-то образом передать экземпляр класса, у которого функция будет вызываться. Это старый способ, должен работать на практически всех компиляторах. Вы можете использовать std::function в принимающий функции. Чтобы построить std::function из функции-члена, можно использовать std::bind, чтобы «подшить» экземпляр класса к функции. Или применить обычную лямбду. Пример: #include#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 f) { f(); } int main() { C c; call1(&c, &C::func); call2(std::bind(&C::func, &c)); call2([&c]() { c.func(); }); return 0; } (проверка) Обратите внимание, что на момент вызова переданной функции исходный объект (на котором функция будет вызываться) обязан существовать, и забота об этом лежит исключительно на программисте (то есть, на вас).
Комментариев нет:
Отправить комментарий