signal 的第二个参数应该是一个指向接受 int 并返回 void 的函数的指针。您传递给信号的是一个指向接受 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);
但我认为,如果您最终使用最后一个解决方案,您可能应该考虑改变您的处理设计:-)!