Страницы

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

вторник, 25 февраля 2020 г.

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

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

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

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