我正在研究一个MIDI控制器库,它有几个类别(例如一个用于按钮,一个用于电位器,一个用于旋转编码器等)。所有这些类都有使用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类,但这需要将其实例传递给每个模拟或数字构造函数。
有没有更好的解决方法?
非常感谢!
彼得
答案 0 :(得分:4)
不是让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);
}