Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Помогите расшифровать макрос С++

22K
01 марта 2007 года
deninok
16 / / 01.03.2007
Уважаемые участники форума!

Вопрос к знатокам теории языка С++.
Есть макрос:

 
Код:
#define Closure(n) (void (TObject::*)(TObject *))&(n)


Вторую его часть никак не пойму. Я понимаю так, что имеется указатель (с явным указанием принадлежности классу TObject) на функцию, принимающую в качестве единственного аргумента указатель на объект класса TObject и возвращающую void. Но далее не понятно. В качестве n (таково применение макроса) передается адрес функции некоторого другого класса (наследника от TObject). Но почему все это написано слитно??? Что это в итоге получается? Помогите, пожалуйста, понять.
3
01 марта 2007 года
Green
4.8K / / 20.01.2000
Берется указатель на функцию/метод, передаваемую по имени (через n), и преобразуется к указателю на метод класса TObject, т.е. к типу
void (TObject::*)(TObject *)
309
02 марта 2007 года
el scorpio
1.1K / / 19.09.2006
Green
Это попытка преобразовать обработчик события - указатель на метод экземпляра класса - в указатель на метод класса. Делается следующим образом

 
Код:
// Пример объявления обработчика базового события VCL
typedef void __fastcall (__closure *TNotifyEvent)(System::TObjectTObject* Sender);


1. n - это "обработчик события" - объект размером 8 байт из двух неименованных полей (адрес метода класса VCL, адрес объекта класса VCL).
2. Выполняем операцию определения адреса (&) для n.
3. Преобразуем адрес обработчика в указатель на функцию - ГЛЮК!!!!!!!

Нужно произвести для полученного указателя операцию обращения по адресу (*). Вот пример эквивалентного кода, который вызывает метод класса, адрес которого извлекается из обработчика события.
 
Код:
typedef void __fastcall (TObject::*TNotifyMethod) (System::TObject* Sender);

TNotifyEvent evt = this->Button1->OnClick;
void **vptr = (void**) &evt;
// Определение адреса метода
TNotifyMethod meth = *(TNotifyMethod*) vptr;
// Вызов метода по указателю meth для объекта this с параметром this
(this->*meth)(this);
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог