我正在开发一个 MIDI Controller 库,它有多个类(例如,一个用于按钮,一个用于电位计,一个用于旋转编码器等)。所有这些类都有使用 sendMIDI 函数的方法。还有一个 setupMIDI 函数,在程序开始时调用一次。 setupMIDI 需要三个参数,需要通过 sendMIDI 函数访问。
类的定义
class Analog {
public:
Analog (...) { ... }
void refresh () {
...
sendMIDI(x, y, z, ...);
...
}
}
class Digital { ... (also uses sendMIDI) ... }
etc.
setupMIDI 和 sendMIDI 函数
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();
}
如您所见,模拟和数字类的所有实例都使用相同的 sendMIDI 函数,这取决于 setupMIDI 函数中输入的值。问题是这些值存储在全局变量中,这并不理想。
我考虑过使用 MidiSender 类,但这需要将其实例传递给每个模拟或数字构造函数。
有没有更好的方法来解决这个问题?
非常感谢!
彼得
最佳答案
而不是有 setupMIDI
设置一些全局变量的函数,有一个 MIDIContext
存储这些值并通过其构造函数初始化它们的类。
pin
的用户, delayTime
,和debug
将是 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);
}
关于c++ - 删除库中的全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42024190/