C ++中的信号:使用成员函数

| 我对
signal()
有疑问: 这段代码可以很好地编译:
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>

void terminate( int param )
{
  printf ( \"Terminating program...\\n\" );
  exit( 1 );
}

int main()
{
    signal( SIGTERM, terminate );
    return 0;
}
但是,以下代码将引发此错误:
g++ -Wall -c -g goober.cpp
goober.cpp: In member function `void GOOBER::yarrgh()\':
goober.cpp:5: error: argument of type `void (GOOBER::)(int)\' does not match `
   void (*)(int)\'
make: *** [goober.o] Error 1
goober.h:
#ifndef GOOBER_H
#define GOOBER_H

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>

using namespace std;

class GOOBER {
public:
    GOOBER(){}
    ~GOOBER(){}
    void yarrgh();
    void terminate( int param );
};

#endif
goober.cpp:
#include \"goober.h\"

void GOOBER::yarrgh()
{
    signal( SIGTERM, terminate );
}

void GOOBER::terminate( int param )
{
    printf( \"Terminating program...\\n\" );
    exit( 1 );
}
driver.cpp:
#include \"goober.h\"

using namespace std;

int main()
{
    GOOBER G;
    G.yarrgh();

    return 0;
}
除了在成员中调用“ 0”以外,我看不出代码有什么区别。任何想法出什么事了,以及如何解决?     
已邀请:
您需要将
terminate()
函数声明为
static
class GOOBER {
    // ...
    static void terminate(int param);
};
这是因为作为非静态成员函数,,7ѭ函数希望传递(隐藏的)
this
参数以指向对象的某些实例。由于信号机制对此一无所知(或者对C ++几乎不了解),因此需要使用
static
函数,以便没有隐藏的
this
参数。     
我可以告诉你怎么了: 您不能像普通函数指针一样使用非静态成员函数。成员函数始终具有隐式的
this
参数,该参数由调用者提供(隐式提供)。 C API无法执行此操作。     
终止必须是该类中的静态函数。     
成员函数具有与不属于任何类的普通函数不同的签名。但是,静态成员函数具有与普通函数相同的签名。因此,您可以将GOOBER类中的终止成员函数声明为静态。     

要回复问题请先登录注册