инициализация массива указателей на функции в конструкторе класса

Тема в разделе "WASM.ZEN", создана пользователем mmshvedko, 11 дек 2006.

  1. mmshvedko

    mmshvedko New Member

    Публикаций:
    0
    Регистрация:
    9 сен 2005
    Сообщения:
    23
    class sys
    {
    public:
    sys () ;

    ...

    private:
    void* ( *pf[16] ) ( void* ) ;

    void* rLongitude ( void* ) ;
    void* rAltitude ( void* ) ;

    ...
    };

    sys::sys()
    {

    pf[0] = rLongitude ; // возвращяет: E2235 Member function must be called or its
    pf[1] = rAltitude ; // address taken

    ...
    }

    void* sys::rLongitude ( void* stk )
    {
    ...
    }
    Без класса всё работает - кто знает подскажите в чём загвоздка ( заранее сенькью )
     
  2. TheRawGod

    TheRawGod New Member

    Публикаций:
    0
    Регистрация:
    6 июл 2003
    Сообщения:
    71
    Тип указателя на функцию в данном случае - "указатель на мембер класса", а не просто указатель на функцию.

    Вот так нужно:
    Код (Text):
    1. class   sys
    2.         {
    3.                 public:
    4.                                 sys () ;
    5.  
    6.                                 ...
    7.  
    8.               private:
    9.                                 void*   ( sys::*pf[16] ) ( void* ) ;   //Важно!
    10.  
    11.                                 void*   rLongitude    ( void* ) ;
    12.                                 void*   rAltitude    ( void* ) ;
    13.  
    14.                                 ...
    15.         };
    16.  
    17. sys::sys()
    18. {
    19.          
    20.         pf[0] = &sys::rLongitude ;     //  Все отлично компилирует:)
    21.         pf[1] = &sys::rAltitude  ;      
    22.      
    23.         ...
    24. }
    25.  
    26. void*   sys::rLongitude    ( void* stk  )
    27. {
    28.           ...
    29. }
     
  3. khv_test

    khv_test New Member

    Публикаций:
    0
    Регистрация:
    30 июн 2004
    Сообщения:
    135
    Взять адрес функции/элемента в структуре/классе не так просто
    выход:
    1. сделать их static
    2. обьявить из для каждой из функции/элемента
    указатель типа void*(*sys::function)(void) и потом над ним делать разименование и записывать в массив.
     
  4. mmshvedko

    mmshvedko New Member

    Публикаций:
    0
    Регистрация:
    9 сен 2005
    Сообщения:
    23
    За оказание помощи , всем братьям по разуму - Спасибо .

    Работающий вариант :

    Код (Text):
    1.         class   sys
    2.         {
    3.                 public:
    4.                                 sys () ;
    5.                                 void*   (*sys::pf[16]) ( void* ) ;
    6.                 private:
    7.                                 static   void*   sys::func ( void* ) ;
    8.                                                      ...
    9.         };
    10.        sys::sys()
    11.        {
    12.               pf[0] = &sys::func ;
    13.        }
    14.        void*   sys::func ( void* stk )
    15.        {
    16.                         ...
    17.        }
     
  5. mmshvedko

    mmshvedko New Member

    Публикаций:
    0
    Регистрация:
    9 сен 2005
    Сообщения:
    23
    TheRawGod

    "указатель на мембер класс" - ? если возможно подробнее ( об'ясни или указатель
    где есть понимание )
     
  6. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    mmshvedko
    Почитай Страуструпа.