[Ubuntu,C ++ 11,g ++]
我很难理解如何将指向子类函数的指针传递回父类
由于我的所有用例都需要一个信号处理程序来终止程序,所以我决定在我的抽象类中实现它的必要部分,并允许一个钩子进行自定义处理。
所以,我希望子类能够将指向其自身版本的“stop”函数的指针传递到'setupSIG_Handler'方法中。 'setupSIG_Handler'然后将此指针指定给全局变量void(* stopFunction)(),该变量从Signal Handler本身调用。
只会有一个孩子的实例。
下面是我的代码(仅显示相关部分),我在setupSIG_Handler签名中从编译器获得语法错误,并从Derived类的构造函数中调用它。
是否有人能够帮助我了解如何使这项工作?
干杯,
N ap个
Abstract.h
class Abstract {
protected:
void setupSIG_Handler(void (*myStopFunction)()) <= ERROR
public:
virtual void stop() = 0;
}
Abstract.cpp
void (*stopFunction)();
static void sigSIGINThandler(int sigNum, siginfo_t *siginfo, void *context) {
std::cerr << std::endl << "Shutting Down Robot" << std::endl;
(*stopFunction)();
exit(0);
}
void NXT::setupSIG_Handler(void (*myStopFunction)()) { <= ERROR
stopFunction = myStopFunction;
struct sigaction ourSIGINTrecord, oldSIGINTrecord;
ourSIGINTrecord.sa_sigaction = &sigSIGINThandler;
sigaction(SIGINT, &ourSIGINTrecord, NULL);
}
Derived.h
class Derived : Abstract {
public:
virtual void stop();
}
Derived.cpp
Derived::Derived() {
setupSIG_Handler(&Derived::stop); <= ERROR
}
void Derived::stop(){
setMotors(0);
}
修改 @Sean&amp; @Josh:谢谢你这么快解释。 是的,我理解静态和实例化方法之间的区别,只是不熟悉如何在C ++中处理它。
答案 0 :(得分:3)
你试图将指向成员函数的指针传递给一个只接受指向C风格函数的指针的方法,这会给你带来问题。
这样想一想,当您尝试调用派生的stop
方法时,sigSIGINThandler
函数将如何知道要调用stop
的实例...?
要解决此问题,请使用std::function类来表示回调:
#include <functional>
std::function<void(void)> stopFunction;
static void sigSIGINThandler(int sigNum, siginfo_t *siginfo, void *context)
{
std::cerr << std::endl << "Shutting Down Robot" << std::endl;
stopFunction();
exit(0);
}
void NXT::setupSIG_Handler(std::function<void(void)> myStopFunction)
{
stopFunction = myStopFunction;
struct sigaction ourSIGINTrecord, oldSIGINTrecord;
ourSIGINTrecord.sa_sigaction = &sigSIGINThandler;
sigaction(SIGINT, &ourSIGINTrecord, NULL);
}
现在你可以像这样注册你的处理程序(使用lambda):
Derived::Derived()
{
auto handler=[this]{stop();};
setupSIG_Handler(handler);
}
或者,您可以使用bind
。
答案 1 :(得分:2)
setupSIG_Handler
获取指向函数的指针,但Derived::Derived
尝试将指针传递给(非静态)成员函数。指向函数的指针与指向成员函数的指针的类型不同,因为(非静态)成员函数采用隐式this
参数。
请参阅C++ FAQ。