摆脱库中的全局变量

时间:2017-02-03 12:20:03

标签: c++ class arduino global-variables

我正在研究一个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类,但这需要将其实例传递给每个模拟或数字构造函数。

有没有更好的解决方法?

非常感谢!
彼得

1 个答案:

答案 0 :(得分:4)

不是让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);
}