есть класс а в нем переменная типа WNDPROC которой надо присвоить указатель на метод который описан в данном классе.Присваивать надо в конструкторе.Можно это сделать не обьявляя метод как static?Например используя указатель на класс this?
this - это указатель на объект, а не на класс. Связи между this и мембер-функцией нет, поэтому нужно как-то передавать и то и то.
Вот если я в классе напишу this->funtion то компилятор во время выполнения возьмет указатель на обьект и вычислит смещение на функцию function сложит адреса и получит абсолютный адрес функции function которую вызовет.Можно ли для данного класса вычислить смещение на memer функцию?
А как тогда работать с callback функциями в обьекте.Например есть обьект у него метод который создает поток.При создании потока необходимо передать адрес callback функции.Обьявлять ее как static метод или делать глобальной?
KingT Объявляй в классе напирмер static void CALLBACK FnXXX(....); а при передаче FnYYY(......,(тут приводим к нужному типу) FnXXX,.....); У меня например было так: (void(__stdcall*)(void)) FnXXX Рабочий и более менее легальный способ.
можно так: Код (Text): void(MyClass::*pMethod)(); ... pMethod = &MyClass::Method; ... (this->*pMethod)(); или так: Код (Text): boost::function<void()> pMethod; ... pMethod = boost::bind(&MyClass::Method, this); ... pMethod();
Ну я только предположил что так происходит а как оно на самом деле я не знаю.Вобще можно по идее не вникать в то как оно там происходит.Создаем обьект, вызываем метод.А как там со стороны ассемблера это все выглядит не важно.До известного предела.
Аффтар, кажется, хочет использовать мембер-функцию как процедуру окна, я прав? Если прав - boost::bind в помощь, другого я что-то вспомнить не могу так сходу.
Voodoo Ну не всегда же этот буст использовать. Можно и стандартными средствами ограничится. Я и W4FhLF их перечислили.
TermoSINteZ я имел ввиду именно возможность использования this из предполагаемой процедуры окна. тут, кажется, только буст.
boost::bind тут не поможет, винда об этом ничего не знает. Связать с окном(или мапу с ключом хендла окна) структуру в которой хряняться this и указатель на метод, затем в оконной функции вызывать это дело.
Voodoo Безусловно не только. (p->*fn)(); Где p указатель на объект и fn указатель на функцию объекта.
Код (Text): void(MyClass::*pMethod)(); ... pMethod = &MyClass::Method; ... (this->*pMethod)(); Мне не очень понятен этот пример.Мы создали указатель на метод в классе,проинициировали его а затем (this->*pMethod)() это вызов функции.this используем так как указатель pMethod относительно класса задан.А можно легально зная this и pMethod вычислить абсолютный адрес функции?
KingT, адрес у метода один всегда. Он статичен. Но необходимо передавать контекст с которым данный метод будет исполняться, им служит указатель на объект класса, в данном случае this. Указатель на объект класса всегда неявно передаётся при вызове метода.
cupuyc Объект с виртуальными функциями в первом фрагменте имеет указатель на vtbl, из которой адреса фцнкций и вынимаются.