реклама на сайте
подробности

 
 
> Вызов функции члена класса через указатель на функцию члена класса (IAR).
Goodvin
сообщение Jun 14 2012, 20:35
Сообщение #1





Группа: Участник
Сообщений: 12
Регистрация: 8-10-09
Из: СПб
Пользователь №: 52 817



Здравствуйте, уважаемые.

Пишу на С++ в 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 14 2012, 20:37
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Непомнящий Евген...
сообщение Jun 15 2012, 05:29
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



Цитата(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(); }

Правда в этом случае компилятор не сможет проверить типы, тут надо соблюдать аккуратность.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 28th July 2025 - 08:52
Рейтинг@Mail.ru


Страница сгенерированна за 0.01371 секунд с 7
ELECTRONIX ©2004-2016