Второй параметр сигнала должен быть указателем на функцию, принимающую интервал и возвращающуюся пусто. То, о чем Вы являетесь передающими для передачи сигналов, является указателем на участник функция, принимающая интервал и возвращающаяся пусто (его тип, являющийся 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;
};
и где-нибудь, сделайте единственный вызов к [1 111]
signal(SIGIO, myClass::callHandlers);
, Но я думаю, что, если Вы заканчиваете тем, что использовали последнее решение, необходимо, вероятно, думать об изменении дизайна обработки :-)!
Для передачи указателя на метод это должен быть статический метод, и необходимо указать имя класса.
Попытка это:
class myClass {
void myFunction ()
{
signal(SIGIO, myClass::myHandler);
}
static void myHandler (int signum)
{
// blabla
}
};
И необходимо также прочитать ссылку, предоставленную Baget, абзац 33.2 в C++ FAQ .