我正在做这样的事情:
#includeclass myClass { public: void myFunction () { signal(SIGIO,myHandler); } void myHandler (int signum) { /** * Handling code */ } }
我正在使用gcc在Ubuntu上工作.
但它不会编译.它抱怨:
错误:类型的参数
void (MyClass::)(int)
不一致void (*) (int)
有线索吗?或者也许只是我不能在课程中使用信号?信号是否仅允许在C中?
错误消息是近似翻译,因为我的编译器不是英文.
signal的第二个参数应该是一个指向接受int并返回void的函数的指针.你传递给signal的是指向成员函数的指针,该成员函数接受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::vectorinstances; };
在某个地方,打一个电话
signal(SIGIO, myClass::callHandlers);
但我认为如果你最终使用最后的解决方案,你应该考虑改变你的处理设计:-)!
要传递指向方法的指针,它必须是静态方法,您必须指定类名.
试试这个:
class myClass { void myFunction () { signal(SIGIO, myClass::myHandler); } static void myHandler (int signum) { // blabla } };
您还应该阅读Baget提供的链接,C++ FAQ中的第33.2段.