Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > signal в классе С++


Автор: fray 21.10.2008, 15:21
Вобщем проблема такая.
есть класс. в котором я пытаюсь установить сигнал и по сигналу получать дуступ к переменной класса, но переменные класса не видятся внутри хендлера сигнала, о чем мне говорит компилятор, undeclared  'std::list <int> L' в функции handler()

Код

Class Test {
    std::list <int> L;
    void handler ();
};
void Test::handler () {
     for (std::list <int>::iterator i = L.begin(); i != L.end(); ++i) // ругается на это что не видит лист L
        close((*i));
}
Test::Test {
   singal(SIGINT, handler);
}

попытки лечит extarnal "C" { handler() {....} },  указание хендлера как static, результат тотже функция singal кушает хендлер но компилетр ругается что  undeclared  'std::list <int> L' в функции handler(), может кто-то решал такую же проблему ?

вроде бы решаемо если 

Код

static std::list <int> L;

Class Test {
    void handler ();
};

extern "C" {
   void handler (int ) {
      for (std::list <int>::iterator i = L.begin(); i != L.end(); ++i) // ругается на это что не видит лист L
         close((*i));
   }
}

Test::Test {
   singal(SIGINT, handler);
}

Но это уже как-то не похоже на С++.

Спасибо.

Автор: mes 21.10.2008, 15:28
Цитата(fray @  21.10.2008,  15:21 Найти цитируемый пост)
указание хендлера как static

static - функции не видят членов класса

Автор: fray 21.10.2008, 15:32
Цитата(mes @ 21.10.2008,  15:28)
Цитата(fray @  21.10.2008,  15:21 Найти цитируемый пост)
указание хендлера как static

static - функции не видят членов класса

А если сделать лист глобальным,  будет работать ? 

Код

static std::list <int> L;

Class Test {
    void handler ();
};

extern "C" {
   void handler (int ) {
      for (std::list <int>::iterator i = L.begin(); i != L.end(); ++i) // ругается на это что не видит лист L
         close((*i));
   }
}

Test::Test {
   singal(SIGINT, handler);
}

Автор: vTictor 21.10.2008, 16:18
Цитата

А если сделать лист глобальным,  будет работать ? 

лучше в метод передавать ссылку или указатель на лист.

А вообще, может у тебя и в исходниках опечятка и вместо signal написано singal ?? smile)

Автор: fray 21.10.2008, 16:57
Цитата(vTictor @ 21.10.2008,  16:18)
Цитата

А если сделать лист глобальным,  будет работать ? 

лучше в метод передавать ссылку или указатель на лист.

А вообще, может у тебя и в исходниках опечятка и вместо signal написано singal ?? smile)

да там опечатка, там signal который принуждает передавать аргумент handler'у тока int поэтому не удасться передать ему ссылку на лист.

Автор: mes 21.10.2008, 17:54
Цитата(fray @  21.10.2008,  15:32 Найти цитируемый пост)
А если сделать лист глобальным,  будет работать ? 

будет. 

Signal имеет сишное происхождение, поэтому использовать наряду с классами напрямую не получится, так как не понятно какому из объектов переселать статический сигнал.
В классе можно определить статическую проксифункцию для принятия сигнала, а также добавить функции для регистрации обьектов, которые хотят получать этот сигнал.
В общем все зависит от того чего конкретно Вы хотите добиться. (в приведенных выше описаниях не хватает как минимум слова объект, чтоб понять Вашу идею)




Автор: fray 22.10.2008, 10:55
Цитата(mes @ 21.10.2008,  17:54)
Цитата(fray @  21.10.2008,  15:32 Найти цитируемый пост)
А если сделать лист глобальным,  будет работать ? 

будет. 

Signal имеет сишное происхождение, поэтому использовать наряду с классами напрямую не получится, так как не понятно какому из объектов переселать статический сигнал.
В классе можно определить статическую проксифункцию для принятия сигнала, а также добавить функции для регистрации обьектов, которые хотят получать этот сигнал.
В общем все зависит от того чего конкретно Вы хотите добиться. (в приведенных выше описаниях не хватает как минимум слова объект, чтоб понять Вашу идею)

Просто хотелось иметь Класс как замкнутый объект с внутренней переменой list L; и соотвественно иметь внутренний хендлер сигнала... и тд. и тп.   также соая ситуация упрощается тем что я имею только один объект(Class Test), ну вобщем понятно раз функция сишная, то и писать придется по сишному.

Автор: mes 22.10.2008, 12:59
Цитата(fray @  22.10.2008,  10:55 Найти цитируемый пост)
  также соая ситуация упрощается тем что я имею только один объект(Class Test),


Ну если объект один , то используйте синглетон, например так :
Код


class Singleton
{
          Singelton() {    singal(SIGINT, SignalProxy);  }
          ~Singelton() {...}
    public:
          static Singleton *GetInstance () { if (!p_obj) p_obj = new Singleton (); return p_obj; }
    
    protected:
          static void SignalProxy  (int n) { Singleton * p = GetInstance() ; if (p) p->Handler(n); }
          void Handler (int n) {   for (std::list <int>::iterator i = L.begin(); i != L.end(); ++i)  close((*i)); }
    private:
          std::list <int> L;

          static Singleton * p_obj;

};
Singleton::p_obj = NULL;


а дальше смотрите под свои нужды

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)