Недавно столкнулся с одной непонятной для меня вещью - указатели на функции класса. Имеют ли они смысл ? В каких случаях используются ? Пример:
class ABC
{
public:
void show()
{
cout << "Hello" << endl;
}
};
int main()
{
void(ABC::*point)() = &ABC::show; // указатель на ф-цию класса
ABC myClass;
(myClass.*point)();
return 0;
}
Такие указатели работают только с объектом. Разве не удобнее вызывать ф-ции класса напрямую ?
ABC myClass;
myClass.show();
Или
ABC myClass;
ABC * point2 = &myClass;
point2->show();
Когда заранее известно какая функция должна вызываться, безусловно, проще использовать явный вызов без каких-то дополнительных указателей. Но не всегда это так. Проблему можно рассматривать в том же смысле, что и указатели на объекты. Т.е. если мы знаем какой объект использовать, то и переменная-указатель на объект нам не нужна, а если такой объект заранее неизвестен, то нужно использовать указатель. Так же и с указателем на функцию. Причем по-большому счету не важно член, или нечлен. Наличие подобных указателей просто добавляет необходимый уровень косвенности в программу.
Да. Мы можем сложить указатели в map, либо ещё куда-то и динамически определять, какая функция должна вызываться. При этом способ вызова останется прежним.
http://ideone.com/zdYvce
#include <iostream>
using namespace std;
class ABC
{
public:
void f1() { cout << "#1" << endl; }
void f2() { cout << "#2" << endl; }
};
int main()
{
void (ABC::*f[])() = {&ABC::f1, &ABC::f2};
ABC myClass;
int x;
while(cin >> x)
(myClass.*f[x&1])();
return 0;
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Какие существуют виды рекламных бордов и как выбрать подходящий?
Как в SQL-запросе подставить в название колонки значения, которые находятся в ней?
Как взять все данные из таблицы в БД и отправить их в Excel (сделать отчет)?