Второй параметр signal должен быть указателем на функцию, принимающую int и возвращающую void. В signal вы передаете указатель на функцию member, принимающую int и возвращающую void (ее тип — 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);
Но я думаю, что если вы в конечном итоге используете последнее решение, вам, вероятно, следует подумать об изменении дизайна вашего манипулятора :-)!
person
Luc Touraille
schedule
05.12.2008