Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

приведение void (my_class::*)(int) к void (*)(int)

2.4K
26 февраля 2007 года
Lexogen
70 / / 18.05.2004
Собсвенно САБЖ.

Вот пример кода:
Код:
class handl {
public:
    void evthandler(int x) {};
};

int main()
{
    handl * hndl = new handl();
    signal(SIGTERM,&handl::evthandler);
         ...   
        return 0;
}

Матюкается(и правильно делает :) ):
Cannot convert 'void (handl::*)(int)' to 'void (*)(int)' to assignment

Как побороть сию зверюгу?
25K
26 февраля 2007 года
hVost
5 / / 26.02.2007
ну ты извращенец однако.. классовые функции разрешено только так и передавать через (handl::*).. но ты можешь сделать эту функцию статичной

 
Код:
class handl {
public:
    static void evthandler(int x) {};
};


тогда можно вызывать эту функцию через класс, а не через его экземпляр.. а так неизвестно, привяжешь ты полученный указатель к экземпляру и к какому экземпляру - неизвестно.. решение проблемы - рефакторинг кода. передавай временные экземпляры через auto_ptr либо вообще пользуйся не сигналами, а исключениями.. :cool:
361
27 февраля 2007 года
Odissey_
661 / / 19.09.2006
Дело в том, что в процессе в один момент времени может быть только один обработчик сигнала.
Поэтому, если используются "ненадежные" сигналы на основе signal (не то что бы в них содержаться ошибки, просто у них куча недостатков при использовании в многопоточных приложениях), то обработчик должен быть статичен и размещаться в глоблальной памяти (иметь тип static).
Концепция "надежныйх" сигналов sigaction требует уже статичную структуру sigaction и глобального обработчика.
Да, и судя по попытке разместить обработчик сигнала в классе, учти что в используемых тобой модели сигналов signal, обработчик сбрасывается на стандартный, после первого вызова =).

Если используешь многопоточное приложение и тебе надо освободить ресурсы, захваченные каждым из потоков по сигналу (а они находятся в общей для потоков памяти), то лучше ИМХО на обработчик повесить установку глобального флажка, а потом по этому флажку в каждом потоке уже и "мусор" собирать.

Цитата:
вообще пользуйся не сигналами, а исключениями..


вообще сигналы, кроме всего прочего являюся еще и IPC, тогда причем здесь исключения?...

25K
27 февраля 2007 года
hVost
5 / / 26.02.2007
я не очень дружу с сигналами и подумал, что идёт речь об обработке ошибок через сигналы. в любом случае передавать указатели на не статичные методы в С-like функциях это бессмыслица.. что бы это под собой не подразумевало
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог