gpt4 book ai didi

c++ - 摆脱库中的全局变量

转载 作者:搜寻专家 更新时间:2023-10-31 00:55:25 26 4
gpt4 key购买 nike

我正在开发一个包含多个类的 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 类,但这需要将它的一个实例传递给每个 Analog 或 Digital 构造函数。

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

非常感谢!
彼得

最佳答案

而不是 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/

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