w*s 发帖数: 7227 | 1 linux里这个例子
void my_handler (int param)
{
signaled = 1;
my_handler2(...);
}
int main ()
{
signal (SIGINT, my_handler);
}
如果my_handler, my_handler2是c++ member function,那么怎么整?
我老用了巨复杂的办法,奶奶的。。。 |
A********i 发帖数: 97 | 2 void my_handler (int param)
{
std::unique_ptr ptr (new classImpl(...));
ptr->my_handler(...);
ptr->my_handler2(...);
} |
s******u 发帖数: 501 | 3 std::bind()
【在 w*s 的大作中提到】 : linux里这个例子 : void my_handler (int param) : { : signaled = 1; : my_handler2(...); : } : int main () : { : signal (SIGINT, my_handler); : }
|
w*s 发帖数: 7227 | 4 高深
【在 A********i 的大作中提到】 : void my_handler (int param) : { : std::unique_ptr ptr (new classImpl(...)); : ptr->my_handler(...); : ptr->my_handler2(...); : }
|
w*s 发帖数: 7227 | 5 完整句子怎么写?
【在 s******u 的大作中提到】 : std::bind()
|
A********i 发帖数: 97 | 6 classImpl cl;
auto my_handler = std::bind(&classImpl::my_handler, std::ref(cl), ...other
params.. )
http://en.cppreference.com/w/cpp/utility/functional/bind |
w***g 发帖数: 5958 | 7 signal里传进去的不能是成员函数。只能把对象指针放到全局变量里,
然后在sighandler里调用全局变量的方法。
std::bind返回的是个对象,不是函数指针,没法传入signal里。
【在 w*s 的大作中提到】 : linux里这个例子 : void my_handler (int param) : { : signaled = 1; : my_handler2(...); : } : int main () : { : signal (SIGINT, my_handler); : }
|
s******u 发帖数: 501 | 8 hmm,没错,signal handler只能是函数指针,没法用bind
另外也可以用class static member function,这样不需要另外定义全局变量和free
function,当然这个handler相应的也不知道class的状态了
【在 w***g 的大作中提到】 : signal里传进去的不能是成员函数。只能把对象指针放到全局变量里, : 然后在sighandler里调用全局变量的方法。 : std::bind返回的是个对象,不是函数指针,没法传入signal里。
|
p****o 发帖数: 96 | 9 谢大牛,帮我看看这样下面的可以吗?
class A {
public:
void my_handler(int param);
void my_handler2(int param);
};
//member function implementations ...
//In C file:
#include
typedef void (*handler_t)(int);
int main ()
{
A a;
handler_t h1, h2;
h1 = &a.my_handler;
h2 = &a.my_hander2;
signal(SIGINT, h1);
signal(SIGINT, h2);
}
【在 w***g 的大作中提到】 : signal里传进去的不能是成员函数。只能把对象指针放到全局变量里, : 然后在sighandler里调用全局变量的方法。 : std::bind返回的是个对象,不是函数指针,没法传入signal里。
|
A********i 发帖数: 97 | 10 这样做是不对的。The types of pointer to member function and pointer to
function are different.
https://isocpp.org/wiki/faq/pointers-to-members
链接里第二个问题给了解法,跟wdong给的一样。
【在 p****o 的大作中提到】 : 谢大牛,帮我看看这样下面的可以吗? : class A { : public: : void my_handler(int param); : void my_handler2(int param); : }; : //member function implementations ... : //In C file: : #include : typedef void (*handler_t)(int);
|
s**y 发帖数: 151 | 11 // A.hpp
class A
{
public:
A();
~A();
static void my_handler(int param);
private:
void handler(int param);
static A *pMe;
};
// A.cpp
static A::pMe = 0;
A::A()
{
pMe = this;
}
A::~A()
{
}
void A::my_handler(int param)
{
if (0 != pMe)
{
pMe = new A();
}
if (0 != pMe)
{
pMe->handler(param);
}
}
void A::handler(int param)
{
// handle the param here
}
//In C file:
#include
#include "A.hpp"
int main ()
{
signal(SIGINT, A::my_handler);
} |