logo search
шпоры по ООП

31.Члены данных объекта и указатели на члены данных класса.

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

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