Бьерн Страуструп - Язык программирования С++. Главы 5-8
Страница 17. Указатели на члены



5.4.5 Указатели на члены

 Можно брать адрес члена класса. Операция взятия адреса функции-члена
 часто оказывается полезной, поскольку цели и способы применения
 указателей на функции, о которых мы говорили в $$4.6.9, в равной
 степени относятся и к таким функциям. Указатель на член можно получить,
 применив операцию взятия адреса & к полностью уточненному имени
 члена класса, например, &class_name::member_name. Чтобы описать
 переменную типа "указатель на член класса X", надо использовать
 описатель вида X::*. Например:

           #include <iostream.h>

           struct cl
           {
              char* val;
              void print(int x) { cout << val << x << '\n'; }
              cl(char* v) { val = v; }
           };

 Указатель на член можно описать и использовать так:

          typedef void (cl::*PMFI)(int);

          int main()
          {
            cl z1("z1 ");
            cl z2("z2 ");
            cl* p = &z2;
            PMFI pf = &cl::print;
            z1.print(1);
            (z1.*pf)(2);
            z2.print(3);
            (p->*pf)(4);
          }

 Использование typedef для замены трудно воспринимаемого описателя
 в С достаточно типичный случай. Операции .* и ->* настраивают
 указатель на конкретный объект, выдавая в результате функцию,
 которую можно вызывать. Приоритет операции () выше, чем у операций
 .* и ->*, поэтому нужны скобки.
     Во многих случаях виртуальные функции ($$6.2.5) успешно
 заменяют указатели на функции.

 
« Предыдущая статья   Следующая статья »