我遇到signal功能问题, 我需要第二个参数调用我的类的函数
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的所有数据都需要清理。没办法那样做?有人可以帮帮我吗?
答案 0 :(得分:1)
可以将解决方案声明为处理正确实例的Singleton Wrapper。我根据Luc Touraille的想法提出下一个代码:
var clicked = false;
function clickAndDisable(e)
{
alert("Entered clickAndDisable function");
if (clicked)
{
e.preventDefault();
}
else
{
clicked = true;
}
}
document.getElementById('link').attachEventListener('click', clickAndDisable);
输出:
#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();
}
如果你想拥有几个Foo实例,我建议你这样做。另一方面,如果你只需要一个Foo实例,你不需要Singleton Wrap和Foo应该是Singleton。