Действительно ли возможно использовать сигнал в классе C++?

31
задан Ayxan 9 February 2019 в 17:47
поделиться

3 ответа

Второй параметр сигнала должен быть указателем на функцию, принимающую интервал и возвращающуюся пусто. То, о чем Вы являетесь передающими для передачи сигналов, является указателем на участник функция, принимающая интервал и возвращающаяся пусто (его тип, являющийся 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;
};

и где-нибудь, сделайте единственный вызов к [1 111]

signal(SIGIO, myClass::callHandlers);

, Но я думаю, что, если Вы заканчиваете тем, что использовали последнее решение, необходимо, вероятно, думать об изменении дизайна обработки :-)!

40
ответ дан 27 November 2019 в 22:23
поделиться

Считайте этот следующий раздел (33.2):

C++ FAQ - указатели на участников

1
ответ дан 11 October 2019 в 01:57
поделиться

Для передачи указателя на метод это должен быть статический метод, и необходимо указать имя класса.

Попытка это:

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

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

И необходимо также прочитать ссылку, предоставленную Baget, абзац 33.2 в C++ FAQ .

9
ответ дан 27 November 2019 в 22:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: