传递一个类的成员函数:类型发出
我使用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
如何解决这个问题?
forwardstep()
和backwardstep()
为非静态成员函数,所以这fwdstp = &FilterWheel::forwardstep;
是指向成员函数,它不能被转换为指针的功能,因为它需要一个对象调用它。
你必须使你的函数是静态的或独立的。
我也想过这个。我宁愿不使用静态或独立函数,因为我认为它会使代码更加复杂。 在我的研究期间,我发现这篇文章[链接] http://*.com/a/402385(和进一步,[链接] http://*.com/questions/282372/demote-boostfunction-toa-a-简单功能指针)似乎是我的问题的解决方案。不幸的是,我不能使用绑定(未在此范围内声明),尽管安装了arduino库的增强功能。 – wergor 2014-09-03 11:44:24
@wergor问题在于你必须传递实际的指针给函数,'boost :: bind'不会帮助你。第二个问题是这些函数是无参数的,即它们只能从某个全局对象或某个类的静态成员中获取状态。 – 2014-09-03 11:52:31
像'void(* forward)()'这样的变量可以接受指向独立非成员函数或静态成员函数的指针。它不会与非静态成员函数一起工作 - 它不知道要调用它的对象。 – 2014-09-02 23:53:57