El segundo parámetro de la señal debe ser un puntero a una función que acepte un vacío int y de retorno. Lo que está pasando para señalizar es un puntero a una función miembro que acepta un vacío int y return (su tipo es void (myClass::*)(int)
). Veo tres posibilidades para superar este problema:
1 - Su método myHandler
puede ser estática: esto es muy bueno, que sea estática
class myClass
{
public:
void myFunction()
{
signal(SIGIO, myClass::myHandler);
}
static void myHandler (int signum)
{
// handling code
}
};
2 - Su método no debe ser estática: si' Si planeas utilizar la señal con una sola instancia, puedes crear un objeto estático privado y escribir un método estático que simplemente llame al método en este objeto. Algo a lo largo de las líneas de
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 - Sin embargo, si usted está planeando sobre el uso de la señal con varias instancias, las cosas se pondrán más complicado. Tal vez una solución sería la de almacenar cada instancia que desea manipular en un vector estático, e invocando el método en cada uno de los siguientes:
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;
};
y en algún lugar, hacer una sola llamada a
signal(SIGIO, myClass::callHandlers);
Pero Creo que si terminas usando la última solución, probablemente deberías pensar en cambiar tu diseño de manejo :-)!
Mira que las señales no están protegidas por hebras, por lo que es posible que no desee volver a examinar esto si necesarry –
La razón es necesario utilizar un método estático (como se describe más adelante), es que llamar a un método que necesita una instancia de la clase (un objeto). No hay forma de pasar un objeto para señalizar, por lo que debe ser un puntero de función normal (no un puntero de método). –
@Robert Gould: cierto; pero no realmente relevante para el tema. –