Обработка сигналов внутри класса

У меня проблемы с сигнал функция,
мне нужно, чтобы второй параметр вызывал функцию моего класса

signal (SIGINT, myClass_function);

но насколько я знаю, это должно быть статическим недействительным. И поэтому я не могу получить доступ к тому же экземпляру моего объекта для доступа к нужным мне переменным

foo.h

class Foo {
public:
std::vector<my_struct> vm = std::vector<my_struct>(50);

static void myClass_function(int parameter) {
// handling signal here
// i need to access vm here
}

};

foo.cpp

void Foo::something() {
// call signal
signal(SIGINT, myClass_function);
}

если пользователь нажимает Ctrl + C, все данные вектора vm должны быть чистыми. Нет способа сделать это? кто-нибудь может мне помочь?

2

Решение

Решением может быть объявлен Singleton Wrapper, который обрабатывает правильный экземпляр. Я предлагаю следующий код, основанный на идее Люка Турэя:

#include <iostream>
#include <signal.h>class Foo;class Wrap {
Foo* foo;

Wrap() = default;

public:
static Wrap& getInstance() {
static Wrap* w = new Wrap();
return *w;
}

void set(Foo* foo_) {
foo = foo_;
}

Foo* get() {
return foo;
}
};class Foo {
int x;

public:
Foo(int x_)
: x(x_) { }

void something() {
// call signal
static Wrap& w = Wrap::getInstance();
w.set(this);
signal(SIGINT, Foo::myHandler);
raise(SIGINT);
}

static void myHandler(int parameter) {
static Wrap& w = Wrap::getInstance();
fprintf(stderr, "%d  %d\n", w.get()->x, parameter);
}
};

int main() {
Foo f(10);
Foo f2(100);
f.something();
f2.something();
}

Выход:

10  2
100  2

Я предлагаю вам это, если вы хотите иметь несколько экземпляров Foo. С другой стороны, если вам нужен только экземпляр Foo, вам не нужен Singleton Wrap, а Foo должен быть Singleton.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]