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

Dri*_*ler 3 c++ signals

我有这个问题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;
}
Run Code Online (Sandbox Code Playgroud)

但是,以下代码会引发此错误:

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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

goober.cpp:

#include "goober.h"

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

void GOOBER::terminate( int param )
{
    printf( "Terminating program...\n" );
    exit( 1 );
}
Run Code Online (Sandbox Code Playgroud)

driver.cpp:

#include "goober.h"

using namespace std;

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

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我没有看到代码有什么不同,除了我signal()在一个成员中打电话.任何想法有什么不对,以及如何解决它?

Gre*_*ill 14

您需要将您的terminate()函数声明为static:

class GOOBER {
    // ...
    static void terminate(int param);
};
Run Code Online (Sandbox Code Playgroud)

这是因为作为非静态成员函数,terminate()函数期望传递(隐藏)this参数以指向对象的某个实例.由于信号机制不知道这个(或者关于C++的任何内容),你需要使用一个static函数,这样就没有隐藏的this参数.

  • 哇,你堆栈花是*令人难以置信的*.很多,很多,非常感谢! (2认同)

Oli*_*rth 7

我可以告诉你什么是错的:

您不能像普通函数指针一样使用非静态成员函数.成员函数总是有一个隐式this参数,由调用者(隐式)提供.AC API无法做到这一点.


Ric*_*ton 5

Terminate必须是类中的静态函数.