адрес member функции на этапе выполнения

Тема в разделе "LANGS.C", создана пользователем KingT, 30 ноя 2009.

  1. KingT

    KingT Member

    Публикаций:
    0
    Регистрация:
    12 янв 2006
    Сообщения:
    208
    есть класс а в нем переменная типа WNDPROC которой надо присвоить указатель на метод который описан в данном классе.Присваивать надо в конструкторе.Можно это сделать не обьявляя метод как static?Например используя указатель на класс this?
     
  2. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    this - это указатель на объект, а не на класс. Связи между this и мембер-функцией нет, поэтому нужно как-то передавать и то и то.
     
  3. KingT

    KingT Member

    Публикаций:
    0
    Регистрация:
    12 янв 2006
    Сообщения:
    208
    Вот если я в классе напишу this->funtion то компилятор во время выполнения возьмет указатель на обьект и вычислит смещение на функцию function сложит адреса и получит абсолютный адрес функции function которую вызовет.Можно ли для данного класса вычислить смещение на memer функцию?
     
  4. RedLord

    RedLord Member

    Публикаций:
    0
    Регистрация:
    23 июн 2005
    Сообщения:
    183
    Адрес:
    Ukraine
    легальных способов нет
     
  5. KingT

    KingT Member

    Публикаций:
    0
    Регистрация:
    12 янв 2006
    Сообщения:
    208
    А как тогда работать с callback функциями в обьекте.Например есть обьект у него метод который создает поток.При создании потока необходимо передать адрес callback функции.Обьявлять ее как static метод или делать глобальной?
     
  6. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    KingT
    Объявляй в классе
    напирмер
    static void CALLBACK FnXXX(....);
    а при передаче
    FnYYY(......,(тут приводим к нужному типу) FnXXX,.....);

    У меня например было так: (void(__stdcall*)(void)) FnXXX
    Рабочий и более менее легальный способ.
     
  7. W4FhLF

    W4FhLF New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2006
    Сообщения:
    1.050
    можно так:

    Код (Text):
    1. void(MyClass::*pMethod)();
    2. ...
    3. pMethod = &MyClass::Method;
    4. ...
    5. (this->*pMethod)();
    или так:

    Код (Text):
    1. boost::function<void()> pMethod;
    2. ...
    3. pMethod = boost::bind(&MyClass::Method, this);
    4. ...
    5. pMethod();
     
  8. maksim_

    maksim_ New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2009
    Сообщения:
    263
    это откуда такая арифметика и что за компилятор так делает?
     
  9. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    maksim_

    Либо афтар имеет ввиду виртуальные функции, либо просто не шарит :)
     
  10. cupuyc

    cupuyc New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2009
    Сообщения:
    763
    так и адреса виртуальных функций не так вичисляются (по крайней мери в vs).
     
  11. KingT

    KingT Member

    Публикаций:
    0
    Регистрация:
    12 янв 2006
    Сообщения:
    208
    Ну я только предположил что так происходит а как оно на самом деле я не знаю.Вобще можно по идее не вникать в то как оно там происходит.Создаем обьект, вызываем метод.А как там со стороны ассемблера это все выглядит не важно.До известного предела.
     
  12. Voodoo

    Voodoo New Member

    Публикаций:
    0
    Регистрация:
    9 апр 2003
    Сообщения:
    297
    Адрес:
    Новосибирск
    Аффтар, кажется, хочет использовать мембер-функцию как процедуру окна, я прав?
    Если прав - boost::bind в помощь, другого я что-то вспомнить не могу так сходу.
     
  13. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    Voodoo
    Ну не всегда же этот буст использовать. Можно и стандартными средствами ограничится. Я и W4FhLF их перечислили.
     
  14. Voodoo

    Voodoo New Member

    Публикаций:
    0
    Регистрация:
    9 апр 2003
    Сообщения:
    297
    Адрес:
    Новосибирск
    TermoSINteZ
    я имел ввиду именно возможность использования this из предполагаемой процедуры окна. тут, кажется, только буст.
     
  15. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    boost::bind тут не поможет, винда об этом ничего не знает.
    Связать с окном(или мапу с ключом хендла окна) структуру в которой хряняться this и указатель на метод, затем в оконной функции вызывать это дело.
     
  16. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Voodoo
    Безусловно не только. (p->*fn)(); Где p указатель на объект и fn указатель на функцию объекта.
     
  17. KingT

    KingT Member

    Публикаций:
    0
    Регистрация:
    12 янв 2006
    Сообщения:
    208
    Код (Text):
    1. void(MyClass::*pMethod)();
    2. ...
    3. pMethod = &MyClass::Method;
    4. ...
    5. (this->*pMethod)();
    Мне не очень понятен этот пример.Мы создали указатель на метод в классе,проинициировали его а затем (this->*pMethod)() это вызов функции.this используем так как указатель pMethod относительно класса задан.А можно легально зная this и pMethod вычислить абсолютный адрес функции?
     
  18. W4FhLF

    W4FhLF New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2006
    Сообщения:
    1.050
    KingT, адрес у метода один всегда. Он статичен. Но необходимо передавать контекст с которым данный метод будет исполняться, им служит указатель на объект класса, в данном случае this. Указатель на объект класса всегда неявно передаётся при вызове метода.
     
  19. Voodoo

    Voodoo New Member

    Публикаций:
    0
    Регистрация:
    9 апр 2003
    Сообщения:
    297
    Адрес:
    Новосибирск
    Booster
    эм. да, я как-то облажался. =)
     
  20. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    cupuyc

    Объект с виртуальными функциями в первом фрагменте имеет указатель на vtbl, из которой адреса фцнкций и вынимаются.