Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> signal в классе С++, signal handler in C++ Class 
V
    Опции темы
fray
  Дата 21.10.2008, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 7.6.2007

Репутация: нет
Всего: 0



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

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

Спасибо.

Это сообщение отредактировал(а) fray - 21.10.2008, 15:29
PM MAIL   Вверх
mes
Дата 21.10.2008, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 1
Всего: 250



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

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

Это сообщение отредактировал(а) mes - 21.10.2008, 15:29


--------------------
PM MAIL WWW   Вверх
fray
Дата 21.10.2008, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 7.6.2007

Репутация: нет
Всего: 0



Цитата(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);
}


Это сообщение отредактировал(а) fray - 21.10.2008, 15:32
PM MAIL   Вверх
vTictor
Дата 21.10.2008, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 13.2.2008

Репутация: нет
Всего: нет



Цитата

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

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

А вообще, может у тебя и в исходниках опечятка и вместо signal написано singal ?? smile)
PM MAIL   Вверх
fray
Дата 21.10.2008, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 7.6.2007

Репутация: нет
Всего: 0



Цитата(vTictor @ 21.10.2008,  16:18)
Цитата

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

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

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

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

PM MAIL   Вверх
mes
Дата 21.10.2008, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 1
Всего: 250



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

будет. 

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





Это сообщение отредактировал(а) mes - 21.10.2008, 17:59


--------------------
PM MAIL WWW   Вверх
fray
Дата 22.10.2008, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 7.6.2007

Репутация: нет
Всего: 0



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

будет. 

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

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

Это сообщение отредактировал(а) fray - 22.10.2008, 11:02
PM MAIL   Вверх
mes
Дата 22.10.2008, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 1
Всего: 250



Цитата(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;


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


Это сообщение отредактировал(а) mes - 22.10.2008, 13:01


--------------------
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0699 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.