gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 04:52:26 29 4
gpt4 key购买 nike

我不是 C++ 专家,我正在尝试创建一个类来处理终端上按下的 ctrl+C。

在我开始将它们移至 SignalHandler 类之前,我的方法就可以正常工作。

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

 sigIntHandler.sa_handler = SomeClass->someMethod(int s);

就像我用 C 语言一样。

sigIntHandler.sa_handler = someMethod(int s);

编译器说:

signals.cpp: In constructor ‘SignalHandler::SignalHandler()’:
signals.cpp:5:39: error: invalid use of non-static member function
registerSignalHandler(ctrlCHandler);
^

我的代码有什么问题?

我想我必须将类成员函数转换为如下形式:(*sa_handler)(int)

cpp文件:

#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 文件:

#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 字段的结构:

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 )

最佳答案

您无法将成员函数转换为函数指针。

不管实际的语义如何,您都可以认为成员函数有一个隐藏的 this 引用,它不能作为自由函数指针传递。

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

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 作为回调,因为它是静态

关于c++ - 如何将 (*sa_handler)(int) 指针设置为类成员函数? (非静态成员函数的无效使用),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54467652/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com