c++中的信号:使用成员函数
signal in C++: using a member function
我对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;
}
我在代码中看不到任何不同,除了我在成员中调用signal()
。有什么想法是错的,以及如何解决它?
您需要将terminate()
函数声明为static
:
class GOOBER {
// ...
static void terminate(int param);
};
这是因为作为一个非静态成员函数,terminate()
函数期望被传递(隐藏的)this
形参来指向对象的某个实例。由于信号机制不知道这个(或c++的任何东西),您需要使用static
函数,这样就没有隐藏的this
参数。
我可以告诉你怎么回事:
不能像普通函数指针那样使用非静态成员函数。成员函数总是有一个隐式的this
参数,该参数由调用方(隐式)提供。C API不能这样做。
Terminate必须是类中的静态函数
成员函数与不属于任何类的普通函数具有不同的签名。但是,静态成员函数与普通函数具有相同的签名。因此,您可以在GOOBER类中将terminate成员函数声明为静态。
相关文章:
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 将公共但非静态的成员函数与ALGLIB集成
- 使用指向成员的指针将成员函数作为参数传递
- 将重载的成员函数传递给函数模板
- 我不小心调用了一个没有自己类对象的成员函数.但这是怎么回事呢
- 如何在C++中使用非静态成员函数作为回调函数
- C++错误C2600:无法定义编译器生成的特殊成员函数(必须首先在类中声明)
- 关联容器的下界复杂性:成员函数与非成员函数
- 在 C++ 中用派生类型重写成员函数
- 链表的泛型函数remove()与成员函数remove)
- 如何将lambda作为模板类的成员函数参数
- constexpr构造函数需要常量成员函数时出现问题
- 将自由函数绑定为类成员函数
- 区分非成员函数和头文件中的成员函数
- 如何从子成员函数修改父公共成员变量
- 保留对其他类的成员函数的引用
- 在运算符重载定义中使用成员函数(const错误)
- 内联如何影响模块接口中的成员函数
- 将成员函数指针作为参数传递给模板方法