Страницы

Поиск по вопросам

понедельник, 13 мая 2019 г.

Вызов метода вне класса

Функция вызывается в классе, ей передается указатель на метод.
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 #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; }
(проверка)
Обратите внимание, что на момент вызова переданной функции исходный объект (на котором функция будет вызываться) обязан существовать, и забота об этом лежит исключительно на программисте (то есть, на вас).

Комментариев нет:

Отправить комментарий