首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将(*sa_handler)(int)指针设置为作为类成员的函数?(无效使用非静态成员函数)

如何将(*sa_handler)(int)指针设置为作为类成员的函数?(无效使用非静态成员函数)
EN

Stack Overflow用户
提问于 2019-01-31 19:09:24
回答 1查看 973关注 0票数 0

我不是C++专家,我试图创建一个类来处理终端上的ctrl+C。

在我开始将它们移到SignalHandler类之前,我的方法是工作的。

看起来,我无法将sigaction.sa_action设置为:

代码语言:javascript
复制
 sigIntHandler.sa_handler = SomeClass->someMethod(int s);

就像我在C。

代码语言:javascript
复制
sigIntHandler.sa_handler = someMethod(int s);

编译器说:

代码语言:javascript
复制
signals.cpp: In constructor ‘SignalHandler::SignalHandler()’:
signals.cpp:5:39: error: invalid use of non-static member function
     registerSignalHandler(ctrlCHandler);
                                       ^

我的代码怎么了?

我想我必须把我的类成员函数转换成这样的东西:(*sa_handler)(int)

cpp文件:

代码语言:javascript
复制
#include "signals.h"

SignalHandler::SignalHandler() {
    isSigtermReceived = false;
    registerSignalHandler(ctrlCHandler);
}

SignalHandler::~SignalHandler() {
}

// private

void SignalHandler::registerSignalHandler(void (*handler)(int)){
    struct sigaction sigIntHandler;
    sigIntHandler.sa_handler = handler;
    sigemptyset(&sigIntHandler.sa_mask);
    sigIntHandler.sa_flags = 0;
    sigaction(SIGINT, &sigIntHandler, NULL);
}

void SignalHandler::ctrlCHandler (int s) { 
    using namespace std;

    cout << endl << "Caught signal " << s << ". Exiting." << endl;
    isSigtermReceived = true;
}

H档案:

代码语言:javascript
复制
#ifndef SIGNALS_H
#define SIGNALS_H

#include <signal.h> // ctrl-c
#include <iostream>

class SignalHandler {
    public:
        SignalHandler();
        virtual ~SignalHandler();
        bool isSigtermReceived;
        void registerSignalHandler(void (*hnd)(int));
    private:
        void ctrlCHandler(int s);
};

#endif /* SIGNALS_H */

这是一个结构,我正在尝试分配sa_handler字段:

代码语言:javascript
复制
struct sigaction {
    void     (*sa_handler)(int);
    void     (*sa_sigaction)(int, siginfo_t *, void *);
    sigset_t   sa_mask;
    int        sa_flags;
    void     (*sa_restorer)(void);
};

(http://man7.org/linux/man-pages/man2/sigaction.2.html)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-31 19:17:31

不能将成员函数转换为函数指针。

尽管有实际的语义,但您可以仅仅认为一个成员函数有一个隐藏的this引用,它不能作为一个空闲函数指针传递。

最简单的解决办法是使用桥梁方法来解决这个问题,例如:

代码语言:javascript
复制
class SignalHandlerDispatcher {
private:
  static SignalHandler* _handler;

public:
  static void setHandler(SignalHandler* handler) { _handler = handler; }
  static void sa_handler(int v) { _handler->SomeMethod(v); }
};

所以现在您可以使用SignalHandlerDispatcher::sa_handler作为回调,因为它是static

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54467652

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档