c++ - 删除库中的全局变量

标签 c++ class arduino global-variables

我正在开发一个 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/

相关文章:

javascript - 如何在 javascript CLASSES (ES6) 上实现静态成员(非函数)

c++ - 如何构建一个元组 vector 并像对一样对它们进行排序?

C++通过构造函数复制对象

android - 在Android中定义 "Indirect subclass"

javascript - 如何为 Arduino 或类似的微 Controller 编写 JavaScript 编译器?

arduino - 没有以太网的 mqtt 串行消息

python - 如何通过 pySerial 从 Python 发送 int 或 string 并在 C 中转为 int 或 String

c++ - 在 RAII 中,持有资源是类不变性意味着什么?

c++ - IsWow64Process PROCESS_QUERY_INFORMATION 检查进程句柄

java - 初学者java调用方法的语法