首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无效使用非静态成员函数- Arduino - Automaton

无效使用非静态成员函数- Arduino - Automaton
EN

Stack Overflow用户
提问于 2017-10-18 11:35:26
回答 2查看 2.5K关注 0票数 1

C++/Arduino中的第一个项目来自JavaScript背景。我对这段代码有一些问题!我得到了这个错误:

代码语言:javascript
复制
C:\Users\Owner\Documents\Arduino\libraries\Pad\Pad.cpp:48:55: error: invalid use of non-static member function

sensor.begin( 15, 5 ).onChange( change_callback, 3 );

以下是cpp:

代码语言:javascript
复制
#include "Pad.h"
#include "Arduino.h"
#include "FastLED.h"
#include "Automaton.h"

extern CRGB leds[64];

Pad::Pad(int val) {
   _val = val;
   _default = CHSV(random(255), 255, 255);
   _cnt = 0;
   fade = false;
  fade_val = 0;
}

void Pad::change_callback( int idx, int v, int up ) {
    Serial.println(v);
    fade_val = v;
}

void Pad::color() {
  my_leds[0] = CHSV(random(255),255,255);
  fade = true;
}

void Pad::init() {
    for(int a = 0 ; a < 8 ; a++) {
      my_leds[a] = _default;
    }
  sensor.begin( 15, 5 ).onChange( change_callback, 3 );
}

void Pad::render() {
    if(fade) {
        int v = map(fade_val, 0, 1023, 0, 255);
        my_leds[0] = CHSV(127,255, v);
        _cnt++;
    }
}

我曾尝试将change_callback设置为静态函数,但这会导致公共类成员fade_val出现错误。我有一种感觉,这与指针有关,我仍然对此犹豫不决。重要的是,每个Pad实例都有自己的传感器和自己的fade_val -它们不能在每个Pad之间共享(静态)。

EN

回答 2

Stack Overflow用户

发布于 2017-10-19 14:07:47

解决方案是将您的Pad::change_callback转换为静态one。但是如果你这样做了,你必须把fade_val的作用域也改成静态的,这对你来说是有问题的。另一种解决方案是将Pad::change_callback封装在std::mem_fun object中,但同样需要将此对象的作用域定义为静态。

我的感觉是,你有静态的单一资源,就像连接在电路板上的传感器,并且需要在产生这种冲突的不同实例对象之间共享它。如果是,则静态跟踪该解决方案,该解决方案是在该时间内分配给传感器的当前实例。最简单的方法是将分配的实例放在静态变量中,以便在静态函数调用中找到。

当然,如果您在整个程序中只有一个Pad实例,请将Pad设为singleton或编写一个大小为一的轮询,以便于处理该单个实例。

票数 0
EN

Stack Overflow用户

发布于 2017-12-10 05:12:36

Lambda函数就是这里的方法。不幸的是,automaton API还不允许使用lambdas来捕获这一点。

这是一个特性请求,https://github.com/tinkerspy/Automaton/issues/17,也许我会找点时间来实现它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46802364

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档