У меня проблемы с сигнал функция,
мне нужно, чтобы второй параметр вызывал функцию моего класса
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 должны быть чистыми. Нет способа сделать это? кто-нибудь может мне помочь?
Решением может быть объявлен 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.
Других решений пока нет …