Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Вызов функции члена класса через указатель на функцию члена класса (IAR).
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
Goodvin
Здравствуйте, уважаемые.

Пишу на С++ в IAR. Не могу скомпилировать следующий код:

Код
class ex;
typedef void (ex::*Tr)(void);

class ex
{
  public:
    Tr fptr;
    ex();
    void func(void);
};

ex::ex()
{
    fptr=&ex::func;
}

void ex::func(void)
{
}

void main()
{
    ex A;
    (A.*func)();
}


Компилятор выдает ошибку: Error[Pe020]: identifier "func" is undefined.
Не могу понять в чем дело. Порылся по книгам, форуму и инету - везде именно так и говорят делать, но увы. Если закомментировать последнюю строку, то компиляция проходит и программа работает. Такое ощущение, что компилятор не видит func, хотя указанно, что этот указатель принадлежит классу ex.

Подскажите, где я мог сделать ошибку?
Заранее спасибо за помощь.
Непомнящий Евгений
Цитата(Goodvin @ Jun 15 2012, 00:35) *
Подскажите, где я мог сделать ошибку?
Заранее спасибо за помощь.


A.func();
(A.*A.fptr)(); // а лучше так: (A.*(A.fptr))()

http://ideone.com/xFeiC

Оффтоп
Вызов через указатель на функцию-член в иаре дает совершенно жуткий код.

Лично я предпочитаю при необходимости оборачивать такую функцию в статическую и юзать обычный указатель на функцию:
Код
class ex
{
  public:        
        ex();

        void func(void) { printf("func\n"); }
        static void func_(ex *o) { o->func(); }
};

typedef void (*Ptr)(ex*);
ex e;
Ptr p = ex::func_;
p(&e);


Заодно этот код при небольшой модификации не требует при вызове знания типа класса:
static void func_2(void *o) { ((ex*)o)->func(); }

Правда в этом случае компилятор не сможет проверить типы, тут надо соблюдать аккуратность.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.