Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 传递类成员函数:类型问题_C++_Arduino - Fatal编程技术网

C++ 传递类成员函数:类型问题

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

我在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()和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