C++.Бархатный путь



         

Указатели на компоненты класса. Доступ по указателю - часть 2


int val = (q.*fp)(6); char val = (pq->*fp4)("new string");

Аналогичным образом осуществляется объявление и инициализация указателей на данные-члены класса. При этом структура объявления указателя на член класса проще (нет спецификации возвращаемого значения, не нужно указывать список параметров). Это не функция, здесь дело обходится спецификацией объявления и квалифицированными именами указателей:

long (XXX::*px1) = &XXX::x1; // Определение и инициализация указателя на член класса XXX типа long q.*px11 = 10; // p - объект-представитель класса XXX. pq->*px11 = 10; // pq - указатель на объект-представитель класса XXX.

Основные приёмы работы с указателями на функции-члены демонстрируются на следующих примерах:

class XXX { public: long x1; int x2; /*Данные-члены класса.*/ long getVal1() {return x1;} long getVal2() {return x2*x1;} /*Функции-члены класса без параметров.*/ int getVal3(int param) {return x2*param;} char* getVal4(char *str) {return str;} /*Функции-члены класса с параметрами.*/ static int f1() {return 100;} static int f2() {return 10;} static int f3(int param) {return param;} /* Определение различных статических функций*/ XXX(long val1, int val2){x1 = val1; x2 = val2;} /*Конструктор.*/ }; void main() { XXX q(1,2);/* Определение объекта.*/ XXX* pq = new (XXX); pq->x1 = 100; pq->x2 = 100; /*Определение и инициализация объекта по указателю.*/ long (XXX::*fp_0) (); /*Указатель на функцию-член класса.*/ long (XXX::*fp_1) () = &XXX::getVal1; /* Проинициализированный указатель на функцию-член класса. Его значение является относительной величиной и равняется значению смещения функции-члена относительно первого члена класса. */ fp_0 = XXX::getVal1; /* Инициализация первого указателя. Один и тот же указатель можно настраивать на различные функции-члены класса. Главное, чтобы у всех этих функций-членов совпадали списки параметров и возвращаемые значения функций. */ long val_1 = (q.*fp1)(); /*Вызов функции-члена класса по указателю из объекта.*/




Содержание  Назад  Вперед