Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Указатель на функцию класса неработает  (Прочитано 4088 раз)
0 Пользователей и 1 Гость смотрят эту тему.
samty
Гость
« : 11-01-2006 21:53 » 

Поскажите почему код не работает
хотя все компилируется без ошибок и
программа работает

Что тут не так


Код:
template < typename T, typename RT_Funct >
class CFunctionPtr
{
public:
T *_ptclass;

typedef RT_Funct (T::*funct)(void);

funct _fnptr;

CFunctionPtr(T *ptclass, funct fn )
{
_ptclass = ptclass;
_fnptr = fn;
}

void Itemfuntion() {
_ptclass->*_fnptr;
}
};



int main( int argc, char *argv[]  )
{

            CFunctionPtr<CMsg, long > playFunct(&messageItem, &CMsg::msg );

             playFunct.showfunction();



   return 0;
}




 
Записан
baldr
Команда клуба

cy
Offline Offline
Пол: Мужской
Дорогие россияне


WWW
« Ответ #1 : 18-01-2006 07:38 » 

По-моему надо конкретный класс указывать в объявлении.
Я тоже примерно так пробовал.
(T::*funct)(void);  - может не получиться. Жаль
Придется связывать классы.
Записан

Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
LP
Помогающий

ru
Offline Offline

« Ответ #2 : 21-01-2006 11:27 » 

samty, эта строчка
Код:
_ptclass->*_fnptr;
должна выглядеть так:
Код:
(_ptclass->*_fnptr)();
Т.к. приоритет у оператора ->* ниже чем у оператора вызова функции '()' нужны дополнительные скобки.
Думаю, проблема была в этом...

Вот так работает:
Код:
#include <iostream>

using namespace std;

template < typename T, typename RT_Funct >
class CFunctionPtr
{
public:
T *_ptclass;

typedef RT_Funct (T::*funct)(void);

funct _fnptr;

CFunctionPtr(T *ptclass, funct fn )
{
_ptclass = ptclass;
_fnptr = fn;
}

void Itemfunction() {
(_ptclass->*_fnptr)();
}

void f() {}
};

struct CMsg
{
    long msg()
    {
        cout << "CMsg::msg()" << '\n';
        return 0L;
    }
};

int main()
{
    CMsg messageItem;
    CFunctionPtr<CMsg, long > playFunct(&messageItem, &CMsg::msg );
    playFunct.Itemfunction();
}

« Последнее редактирование: 19-12-2007 21:47 от Алексей1153++ » Записан

Если эта надпись уменьшается, значит ваш монитор уносят
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines