Второй параметр сигнала должен быть указателем на функцию, принимающую int и возвращающую пустоту. То, что вы передаете, является указателем на функцию , принимающую int и возвращающую пустоту (ее тип равен void (myClass::*)(int)
). Я вижу три возможности, чтобы преодолеть эту проблему:
1 - Ваш метод myHandler
может быть статическим: это здорово, сделать его статическим
class myClass
{
public:
void myFunction()
{
signal(SIGIO, myClass::myHandler);
}
static void myHandler (int signum)
{
// handling code
}
};
2 - Ваш метод не должен быть статичным: если вы» планируя использовать сигнал только с одним экземпляром, вы можете создать частный статический объект и написать статический метод, который просто вызывает метод на этом объекте. Что-то вдоль линий
class myClass
{
public:
void myFunction()
{
signal(SIGIO, myClass::static_myHandler);
}
void myHandler (int signum)
{
// handling code
}
static void static_myHandler(int signum)
{
instance.myHandler(signum);
}
private:
static myClass instance;
};
3 - Тем не менее, если вы планируете использовать сигнал с несколькими экземплярами, вещи становятся более сложными. Возможно, решение будет хранить каждый экземпляр, который вы хотите управлять в статическом векторе, и вызов метода на каждом из них:
class myClass
{
public:
void myFunction() // registers a handler
{
instances.push_back(this);
}
void myHandler (int signum)
{
// handling code
}
static void callHandlers (int signum) // calls the handlers
{
std::for_each(instances.begin(),
instances.end(),
std::bind2nd(std::mem_fun(&myClass::myHandler), signum));
}
private:
static std::vector<myClass *> instances;
};
и где-то, сделать один вызов
signal(SIGIO, myClass::callHandlers);
Но Я думаю, что если вы в конечном итоге используете последнее решение, вам, вероятно, стоит подумать об изменении дизайна обработки :-)!
Учтите, что сигналы не потокобезопасны, так что вы не могли бы хотеть пересмотреть это, если necesarry – 2008-12-05 08:55:57
Причины вы должны использовать статический метод (как описано ниже), является то, что для вызова метода вам нужен экземпляр класса (объекта). Невозможно передать объект в сигнал, поэтому он должен быть нормальным указателем функции (а не указателем метода). – 2008-12-05 17:27:07
@Robert Gould: True; но на самом деле не имеет отношения к предмету. – 2008-12-05 17:28:19