【发布时间】:2019-04-12 23:48:07
【问题描述】:
我的 C/C++ 技能有点生疏,过去几年我大部分时间都在使用 Java。现在我刚开始玩 Arduino,并制作了一个简单的按钮类。我想添加一个事件监听器,所以我做了这样的事情:
class MyButton{
public:
MyButton(byte pin);
bool isPressed();
bool wasToggled();
bool wasPressed();
void eventLoop();
inline void setListener(MyButtonListener* listener) { _listener = listener; }
private:
byte _pin;
boolean _lastToggledState = false;
MyButtonListener* _listener;
};
class MyButtonListener{
public:
virtual void onPressed() = 0;
private:
};
eventLoop() 方法(打算从 Arduino 的loop() 函数调用),调用监听器类中的onPressed() 方法:
void MyButton::eventLoop(){
if( wasPressed() && _listener ){
_listener->onPressed();
}
}
到目前为止,一切都还好。但我无法弄清楚如何在主 Arduino 文件中实际分配和使用监听器。来自Java,我习惯于做类似的事情
myBtn.setListener( new MyButtonListener(){
void onPressed(){
Serial.println("Pressed");
toggleLed(); // toggleLed() is a method in the main Arduino file
}
});
我让它以一种非常复杂的方式工作,通过声明一个将toggleLed() 方法作为参数的新类(因为否则无法从新类中访问它):
class BtnListener : public MyButtonListener{
public:
BtnListener(void* toggleFunction) : _toggleFunction(toggleFunction){ };
private:
void (*_toggleFunction)();
void onPressed(){
Serial.println("Pressed");
_toggleFunction();
};
};
myBtn.setListener( new BtnListener(toggleLed) );
在 C++ 中肯定有更方便的方法来做这样的事情吗?一个监听器是可行的(但很难看)——我什至无法想象拥有 10 个按钮的恐怖,它们都需要不同的监听器实现......
【问题讨论】:
-
C++ 没有任何类似于内联生成的匿名类的东西,比如 Java。 C++ 不是 Java,它以完全不同的方式工作。在 C++ 中,使用内联 lambda 实现等效功能,并使用
std::function进行类型擦除。 C++ 在过去十年左右发生了很大变化。如果不拿起 a good C++ book 并花一些时间阅读它,您将不会对现代 C++ 走得太远。 -
以_开头的变量和函数为编译器保留
-
@Brandon 不是全部。
-
@Brandon
_Uppercases保留在任何地方,但_lowercases仅保留在全局命名空间中。这很好。
标签: c++ interface arduino listener anonymous-inner-class