Язык программирования C++ для профессионалов

       

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


Можно брать адрес члена класса. Операция взятия адреса функции-члена часто оказывается полезной, поскольку цели и способы применения указателей на функции, в равной степени относятся и к таким функциям. Указатель на член можно получить, применив операцию взятия адреса & к полностью уточненному имени члена класса, например, &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 для замены трудно воспринимаемого описателя в С достаточно типичный случай. Операции .* и ->* настраивают указатель на конкретный объект, выдавая в результате функцию, которую можно вызывать. Приоритет операции () выше, чем у операций .* и ->*, поэтому нужны скобки.

Во многих случаях виртуальные функции успешно заменяют указатели на функции.



Содержание раздела