Страницы

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

пятница, 9 ноября 2018 г.

Вызов методов класса через указатель на функцию

Хочу реализовать возможность передавать в качестве аргумента функции указатель на метод разных классов.
class A1 { public: void show() { std::cout << "A1" << std::endl; } };
class B1 { public: void show() { std::cout << "B1" << std::endl; } };
void callf(void (*fp)()) { fp(); }
int main() { callf(&A1::show); callf(&B1::show);
return 0; }


Ответ

В вашем варианте забыта мелочь - то, что нестатическая функция-член требует наличия объекта, для которого вызывается. Так что просто так вызвать не получится, нужен объект.
Или статическая функция.
Вот так - запросто:
class A1 { public: static void show() { std::cout << "A1" << std::endl; } };
class B1 { public: static void show() { std::cout << "B1" << std::endl; } };
void callf(void (*fp)()) { fp(); }
int main() { callf(&A1::show); callf(&B1::show);
return 0; }
Если все же не статические - то, например, вот:
class A1 { public: void show() { std::cout << "A1" << std::endl; } };
class B1 { public: void show() { std::cout << "B1" << std::endl; } };
template void callf(T& t, void (T::*f)()) { (t.*f)(); }
int main() { A1 a; B1 b; callf(a,&A1::show); callf(b,&B1::show);
return 0; }

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

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