пятница, 17 июня 2011 г.

Указатель на метод класса в с++.

Стандарт Ansi C++ при объявлении указателя на функцию класса (не статическую) предусматривает использование полной квалификации. При этом при вызове функции требуется явно передать экземпляр класса.

Выделить всёкод C++
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
class Class1
{
   static void Func1(void);
   void Func2(void); 
}
//указатель на просто функцию
typedef void (*SimplyFunc)(void);
//указатель на функцию класса Class1
typedef void (Class1::*ClassFunc)(void);
....
//так можно - функция класса статическая
SimplyFunc  simplyFunc = &Class1::Func1;

//так нельзя - компилятора выдаст ошибку
SimplyFunc  Func = &Class1::Func2;

//так можно
ClassFunc classFunc = &Class1::Func2;

//вызов статической функции класса - экземпляр класса передавать не нужно
simplyFunc();

Class1 class1;
//вызов функции класса - передаем экземпляр класса
class1.*func();


В С++Builder введено дополнительное ключевое слово _ _ closure, которая упрощает весь этот механизм. По сути дела объявляется не просто указатель на функцию класса, а своего рода указатель на функцию экземпляра класса.
Выделить всёкод C++
1:
2:
3:
4:
5:
typedef void(_ _closure *ObjectFunc)(void);

Class1 class1;
ObjectFunc objectFunc = class1.Func2;
objectFunc();

В данном случае в указателе храниться не только указатель на функцию, но и указатель на объект. Поэтому при вызове функции явной передачи экземпляра класса не требуется.

PS. "Верным курсом идем, товарищи" . В VC++  версии 7(Net) также появилось нечто подобное, только название другое _ _ delegate , а также многое другое, что уже давно изначально использовалось в C++Builder. и называется это Managed Extensions for C++ .

Комментариев нет:

Отправить комментарий