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

Posted

技术标签:

【中文标题】C ++将指向子函数的指针传递回父类【英文标题】:C++ passing pointer to child's function back to parent class 【发布时间】:2014-10-21 13:39:43 【问题描述】:

[Ubuntu, C++11, g++]

我很难理解如何将指向子类函数的指针传递回父类。 由于我的所有用例都需要一个信号处理程序来终止程序,因此我决定在我的抽象类中实现它的必要部分,并允许一个用于自定义处理的钩子。 所以,我希望子类能够将指向他们自己版本的“stop”函数的指针传递给“setupSIG_Handler”方法。然后,“setupSIG_Handler”将此指针分配给从信号处理程序本身调用的全局变量 void (*stopFunction)()。 孩子只会有一个实例。

以下是我的代码(仅显示相关部分),我在 setupSIG_Handler 签名中从编译器获取语法错误,并从派生类的构造函数调用它。

谁能帮助我了解如何进行这项工作?

干杯, 打盹

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 & @Josh:感谢您这么快解释。 是的,我了解静态方法和实例化方法之间的区别,只是不熟悉如何在 C++ 中处理它。

【问题讨论】:

请给出确切的行和错误...请。 【参考方案1】:

您试图将指向成员函数的指针传递给只接受指向 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

【讨论】:

如果不使用auto,var 类型会是什么? @Nap - 应该是`std::function【参考方案2】:

setupSIG_Handler 接受一个指向函数的指针,但Derived::Derived 试图将一个指针传递给一个(非静态)成员函数。指向函数的指针与指向成员函数的指针的类型不同,因为(非静态)成员函数采用隐式 this 参数。

请参阅C++ FAQ。

【讨论】:

以上是关于C ++将指向子函数的指针传递回父类的主要内容,如果未能解决你的问题,请参考以下文章

如何将指针传递给字符串,指向子字符串的指针,并返回其他内容?

OC(C语言特性函数,指针)

将c ++引用的地址传递给指针

使用 CFFI 从 Python 传递指向 C 函数的指针的最佳方法

c ++按值或指向函数语法的指针传递数组

将指向局部变量的指针传递给函数:它安全吗?