Имеют ли смысл указатели на ф-ции класса?

343
16 января 2017, 20:31

Недавно столкнулся с одной непонятной для меня вещью - указатели на функции класса. Имеют ли они смысл ? В каких случаях используются ? Пример:

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();
Answer 1

Когда заранее известно какая функция должна вызываться, безусловно, проще использовать явный вызов без каких-то дополнительных указателей. Но не всегда это так. Проблему можно рассматривать в том же смысле, что и указатели на объекты. Т.е. если мы знаем какой объект использовать, то и переменная-указатель на объект нам не нужна, а если такой объект заранее неизвестен, то нужно использовать указатель. Так же и с указателем на функцию. Причем по-большому счету не важно член, или нечлен. Наличие подобных указателей просто добавляет необходимый уровень косвенности в программу.

Answer 2

Да. Мы можем сложить указатели в 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;
}
READ ALSO
Помогите создать SQL запрос

Помогите создать SQL запрос

Есть 2 таблицыparam_price:

324
Как взять названия колонок из значения колонки

Как взять названия колонок из значения колонки

Как в SQL-запросе подставить в название колонки значения, которые находятся в ней?

328
Экспорт данных из phpMyAdmin в Excel

Экспорт данных из phpMyAdmin в Excel

Как взять все данные из таблицы в БД и отправить их в Excel (сделать отчет)?

325
Ошибка 5 с Software\JavaSoft\Prefs

Ошибка 5 с Software\JavaSoft\Prefs

янв 14, 2017 10:44:54 PM javautil

348