传递一个类的成员函数:类型发出

问题描述:

我使用AccelStepper库在我的Arduino的项目,该库有一个构造函数,与功能参数:传递一个类的成员函数:类型发出

AccelStepper(void (*forward)(), void (*backward)()); 

在主草图,这是所使用的代码:

void forwardstep() { 
    AFstepper->onestep(FORWARD, stepType); //some code to move the motor 
} 
void backwardstep() { 
    AFstepper->onestep(BACKWARD, stepType); //some code to move the motor 
} 
AccelStepper stepper(forwardstep, backwardstep); 

只要这段代码在主草图中,一切正常。

我已经创建了具有AccelStepper对象和forwardstep()和backwardstep()函数作为成员的一类,但我无法通过功能AccelStepper的构造: h文件:

#define IICADDRESS 0x60 

class FilterWheel : public Device 
{ 
public: 
    FilterWheel(); 

    void forwardstep(); 
    void backwardstep(); 
    void (*fwdstp)();  //function pointer 
    void (*bckwdstp)(); //function pointer 
private: 
    //Adafruit Motor Shield object 
    Adafruit_MotorShield AFMS; 
    //Adafruit Stepper Motor object 
    Adafruit_StepperMotor *AFstepper; 
    //AccelStepper wrapper 
    AccelStepper stepper; 
}; 

.cpp文件:

#include "FilterWheel.h" 

//constructor 
FilterWheel::FilterWheel() 
{ 
    fwdstp = &FilterWheel::forwardstep; 
    bckwdstp = &FilterWheel::backwardstep; 

    Adafruit_MotorShield AFMS (IICADDRESS); 
    Adafruit_StepperMotor *AFstepper = AFMS.getStepper(200, 1); //M1 M2 
    //AccelStepper stepper(forwardstep, backwardstep); //doesn't work 
    AccelStepper stepper(fwdstp, bckwdstp);    //works only if fwdstp = &FilterWheel::forwardstep; and bckwdstp = &FilterWheel::backwardstep; are commented out 
} 

//go 1 step forward 
void FilterWheel::forwardstep() { 
    AFstepper->onestep(FORWARD, stepType); 
} 
//go 1 step backward 
void FilterWheel::backwardstep() { 
    AFstepper->onestep(BACKWARD, stepType); 
} 

当我尝试直接传递的功能,

AccelStepper stepper(forwardstep, backwardstep); 

编译器显示以下错误:

FilterWheel.cpp:34: error: no matching function for call to 'AccelStepper::AccelStepper(<unresolved overloaded function type>, <unresolved overloaded function type>)' 
AccelStepper.h:AccelStepper(void (*)(), void (*)()) 
AccelStepper.h:AccelStepper(uint8_t, uint8_t, uint8_t, uint8_t, uint8_t, bool) 
AccelStepper.h:AccelStepper(const AccelStepper&) 
Error compiling 

当我连接功能的函数指针,

fwdstp = &FilterWheel::forwardstep; 
    bckwdstp = &FilterWheel::backwardstep; 
    AccelStepper stepper(fwdstp, bckwdstp); 

编译器显示这些错误:

FilterWheel.cpp:In constructor 'FilterWheel::FilterWheel()' 
FilterWheel.cpp:22: error: cannot convert 'void (FilterWheel::*)()' to 'void (*)()' in assignment 
FilterWheel.cpp:23: error: cannot convert 'void (FilterWheel::*)()' to 'void (*)()' in assignment 
Error compiling 

如何解决这个问题?

+0

像'void(* forward)()'这样的变量可以接受指向独立非成员函数或静态成员函数的指针。它不会与非静态成员函数一起工作 - 它不知道要调用它的对象。 – 2014-09-02 23:53:57

forwardstep()backwardstep()为非静态成员函数,所以这fwdstp = &FilterWheel::forwardstep;是指向成员函数,它不能被转换为指针的功能,因为它需要一个对象调用它。

你必须使你的函数是静态的或独立的。

+0

我也想过这个。我宁愿不使用静态或独立函数,因为我认为它会使代码更加复杂。 在我的研究期间,我发现这篇文章[链接] http://*.com/a/402385(和进一步,[链接] http://*.com/questions/282372/demote-boostfunction-toa-a-简单功能指针)似乎是我的问题的解决方案。不幸的是,我不能使用绑定(未在此范围内声明),尽管安装了arduino库的增强功能。 – wergor 2014-09-03 11:44:24

+0

@wergor问题在于你必须传递实际的指针给函数,'boost :: bind'不会帮助你。第二个问题是这些函数是无参数的,即它们只能从某个全局对象或某个类的静态成员中获取状态。 – 2014-09-03 11:52:31