C++ 传递类成员函数:类型问题
我在Arduino项目中使用该库,该库有一个构造函数,函数作为参数:C++ 传递类成员函数:类型问题,c++,arduino,C++,Arduino,我在Arduino项目中使用该库,该库有一个构造函数,函数作为参数: AccelStepper(void (*forward)(), void (*backward)()); 在主草图中,这是使用的代码: void forwardstep() { AFstepper->onestep(FORWARD, stepType); //some code to move the motor } void backwardstep() { AFstepper->onestep(BA
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()和BackardStep()函数作为成员,但我无法将这些函数传递给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
编译器显示以下错误:
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()
是非静态成员函数,因此此fwdsp=&FilterWheel::forwardstep
是指向成员函数的指针,无法将其转换为指向函数的指针,因为它需要一个对象来调用它
必须将函数设置为静态函数或独立函数。像
void(*forward)(
这样的变量可以接受指向独立非成员函数或静态成员函数的指针。它不能与非静态成员函数一起工作-它不知道调用哪个对象。我也考虑过这一点。我宁愿不使用静态或独立函数,因为我认为这会使代码更加复杂。在我的研究中,我发现这篇文章[链接](还有[链接])似乎是我问题的解决方案。不幸的是,尽管安装了boost for arduino库,但我无法使用bind(未在此范围内声明)。@wergor问题是,您必须向函数传递真正的指针,boost::bind
对您没有帮助。第二个问题是,这些函数是无参数的,也就是说,它们只能从某个全局对象或某个类的静态成员获取状态。
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