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) успешно заменяют указатели на функции.


Назад  |  Вперёд


OtDiatlovaOU
К началу книги

Оформление и дизайн книги OtDiatlovaOU.
Вся книга, архив.