当前位置:  开发笔记 > 编程语言 > 正文

是否可以在C++类中使用信号?

如何解决《是否可以在C++类中使用信号?》经验,为你挑选了2个好方法。

我正在做这样的事情:

#include 

class myClass {
public: 
    void myFunction () 
    {
        signal(SIGIO,myHandler);
    }

    void myHandler (int signum)
    {
        /**
        * Handling code
        */
    }

}

我正在使用gcc在Ubuntu上工作.

但它不会编译.它抱怨:

错误:类型的参数void (MyClass::)(int)不一致void (*) (int)

有线索吗?或者也许只是我不能在课程中使用信号?信号是否仅允许在C中?

错误消息是近似翻译,因为我的编译器不是英文.



1> Luc Touraill..:

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::vector instances;
};

在某个地方,打一个电话

signal(SIGIO, myClass::callHandlers);

但我认为如果你最终使用最后的解决方案,你应该考虑改变你的处理设计:-)!



2> Jørn Jensen..:

要传递指向方法的指针,它必须是静态方法,您必须指定类名.

试试这个:

class myClass {
  void myFunction () 
  {
    signal(SIGIO, myClass::myHandler);
  }

  static void myHandler (int signum)
  {
     // blabla
  }
};

您还应该阅读Baget提供的链接,C++ FAQ中的第33.2段.

推荐阅读
女女的家_747
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有