gpt4 book ai didi

c++ - 非静态成员函数的无效使用 - Arduino - Automaton

转载 作者:太空宇宙 更新时间:2023-11-04 12:55:44 27 4
gpt4 key购买 nike

来自 JavaScript 背景的第一个 C++/Arduino 项目。我在使用这段代码时遇到了一些问题!我收到此错误:

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:

#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 出现错误,它是一个公共(public)类成员。我有一种感觉,这与指针有关,我仍在思考这个问题。重要的是每个 Pad 实例都有自己的传感器和自己的 fade_val - 它们不能在每个 Pad 之间共享(静态)。

最佳答案

解决方案是将 Pad::change_callback 转换为静态回调。但是如果你这样做,你必须将 fade_val 的范围也更改为 static 并且不知何故这对你来说是有问题的。另一种解决方案是将 Pad::change_callback 包含在 std::mem_fun object 中。 , 但您需要再次将此对象的范围定义为静态。

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

当然,如果整个程序中只有一个 Pad 实例,则将 Pad 设为 singleton或编写统一的民意调查代码,以便轻松处理单个实例。

关于c++ - 非静态成员函数的无效使用 - Arduino - Automaton,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46802364/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com