去掉库中的全局变量



我正在开发一个MIDI控制器库,该库有几个类(例如一个用于按钮,一个用于电位计,一个用作旋转编码器等)。所有这些类都有使用sendMIDI函数的方法。还有一个setupMIDI函数,在程序开始时调用一次。setupMIDI需要三个参数,这些参数需要由sendMIDI函数访问。

类别的定义

class Analog {
public:
Analog (...) { ... }
void refresh () {
...
sendMIDI(x, y, z, ...);
...
}
}
class Digital { ... (also uses sendMIDI) ... }
etc.

设置MIDI和发送MIDI功能

byte pin;
int delayTime;
bool debug;
void setupMIDI (byte p, int d, bool db = false) {
...
pin = p; delayTime = d; debug = db;
...
}
void sendMIDI ( ... ) {
...
if(debug) ...
digitalWrite(pin, 1);
delay(delayTime);
...
}

实际程序:

Analog a1( ... );
Analog a2( ... );
Digital d1( ... );
setupMIDI(13, 10, true);
while(true) {
a1.refresh(); // calls sendMIDI
a2.refresh();
d1.refresh();
}

正如您所看到的,Analog和Digital类的所有实例都使用相同的sendMIDI函数,这取决于在setupMIDI函数中输入的值。问题是这些值存储在全局变量中,这并不理想。

我曾考虑过使用MidiSender类,但这需要将其实例传递给每个Analog或Digital构造函数。

有更好的方法来解决这个问题吗?

非常感谢
Pieter

与其使用setupMIDI函数来设置一些全局变量,不如使用MIDIContext类来存储这些值并通过其构造函数对其进行初始化。

pindelayTimedebug的用户将是MIDIContext方法,或者使用MIDIContext&(适当时为const&)来访问这些值。

示例:

class MIDIContext
{
private:
byte pin;
int delayTime;
bool debug;
public:
MIDIContext(byte x_pin, int x_delayTime, bool x_debug) 
: pin{x_pin}, delayTime{x_delayTime}, debug{x_debug}
{
}
void sendMIDI();
};
class Analog
{
void refresh (MIDIContext& ctx);
};

可能用途:

Analog a1( ... );
Analog a2( ... );
Digital d1( ... );
MIDIContext context(13, 10, true);
while(true) {
a1.refresh(context);
a2.refresh(context);
d1.refresh(context);
}

相关内容

  • 没有找到相关文章

最新更新