C ++将指向子函数的指针传递回父类

时间:2014-10-21 13:39:44

标签: c++ c++11

[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 ++中处理它。

2 个答案:

答案 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