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::functionsetupSIG_Handler
接受一个指向函数的指针,但Derived::Derived
试图将一个指针传递给一个(非静态)成员函数。指向函数的指针与指向成员函数的指针的类型不同,因为(非静态)成员函数采用隐式 this
参数。
请参阅C++ FAQ。
【讨论】:
以上是关于C ++将指向子函数的指针传递回父类的主要内容,如果未能解决你的问题,请参考以下文章
如何将指针传递给字符串,指向子字符串的指针,并返回其他内容?