【问题标题】:passing a class member function: type issues传递类成员函数:类型问题
【发布时间】:2014-09-02 23:50:28
【问题描述】:

我在我的Arduino项目中使用AccelStepper库,该库有一个构造函数,函数作为参数:

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() 和 backstep() 函数作为成员的类,但我无法将这些函数传递给 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

我该如何解决这个问题?

【问题讨论】:

  • void (*forward)() 这样的变量可以接受指向独立非成员函数或静态成员函数的指针。它不适用于非静态成员函数——它不知道在哪个对象上调用它。

标签: c++ arduino


【解决方案1】:

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

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

【讨论】:

  • 我也想过这个问题。我宁愿不使用静态或独立函数,因为我认为它会使代码更加复杂。在我的研究过程中,我发现这篇文章 [link]stackoverflow.com/a/402385(还有 [link]stackoverflow.com/questions/282372/…)似乎可以解决我的问题。不幸的是,尽管安装了 arduino 库的 boost,但我无法使用 bind(未在此范围内声明)。
  • @wergor 问题是你必须将真正的指针传递给函数,boost::bind 帮不了你。第二个问题是这些函数是无参数的,也就是说它们只能从某个全局对象或某个类的静态成员中获取状态。
猜你喜欢
  • 1970-01-01
  • 2014-02-06
  • 2017-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多