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

Можно брать адрес члена класса. Получение адреса функции члена часто бывает полезно, поскольку те цели и причины, которые приводились в #4.6.9 относительно указателей на функции, в равной степени применимы и к функциям членам. Однако, на настоящее время в языке имеется дефект: невозможно описать выражением тип указателя, который получается в результате этой операции. Поэтому в текущей реализации приходится жульничать, используя трюки. Что касается примера, который приводится ниже, то не гарантируется, что он будет работать. Используемый трюк надо локализовать, чтобы программу можно было преобразовать с использованием соответствующей языковой конструкции, когда появится такая возможность. Этот трюк использует тот факт, что в текущей реализации this реализуется как первый (скрытый) параметр функции члена:

#include struct cl { char* val; void print(int x) { cout << val << x << "\n"; }; cl(char* v) { val = v; } }; // ``фальшивый'' тип для функций членов: typedef void (*PROC)(void*, int); main() { cl z1("z1 "); cl z2("z2 "); PROC pf1 = PROC(&z1.print); PROC pf2 = PROC(&z2.print); z1.print(1); (*pf1)(&z1,2); z2.print(3); (*pf2)(&z2,4); }

Во многих случаях можно воспользоваться виртуальными функциями (см. Главу 7) там, где иначе пришлось бы использовать указатели на функции*2.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: