对象数组的C ++方法

时间:2015-07-10 16:45:27

标签: c++ arrays class oop object

我用C ++创建了一个类。每个对象对应一个微控制器上的I / O引脚。我可以创建一个对象数组,然后使用for循环将每个引脚设置为输出。我希望能够在同一时间将多个引脚设置为输出。这可以通过硬件来完成。

我正在尝试创建一个可以处理对象数组的方法。你可以这样使用它:

Pin myPins[] = {0,1,2};
myPins.setOuput();

基本上我想创建一个适用于对象数组的方法。是否可以创建这样的setOuput方法?如果有,怎么样?感谢。

更新1

新的非会员方法

void setOutput(Pin pins[], int size) {
    volatile uint8_t* _DDR = pins[0].getDDR();
    uint8_t _offset = 0;
    for (int i = 0; i < size; i++) {
        _offset |= pins[i].getOffset();
    }
    DDR_HIGH;
}

我在名称中使用_,以便我的现有宏工作。不是很好,但代码较少。

2 个答案:

答案 0 :(得分:2)

不,您不能按照预期的方式向经典数组添加方法。但是,您可以创建一个继承自std::vector<Pin>的类,并向其添加方法,如下所示:

class Pins : public std::vector<Pin>
{
public:
    void setOutput() { /* your code here */ }
};

这样,使用C ++ 11的统一初始化,您可以使用类似的语法:

Pins myPins = {0, 1, 2};
myPins.setOutput();

编辑:根据评论,子类STL容器是一个快速而肮脏的解决方案,而不是最好的主意。但是,您可以非常简单地创建自己的包装类:

class Pins
{
    std::vector<Pin> mPins;

public:
    Pins (std::initializer_list<Pin> pins) : mPins(pins)
    { }

    void setOutput()
    {
        cout << "Pins in this pinset:" << endl;

        for (Pin & p : mPins)
        {
            cout << "\t" << p << endl;
        }
    }
};

完全相同:

Pins myPins = {0, 1, 2};
myPins.setOutput();

答案 1 :(得分:0)

您的setOutput 成员函数很可能正在读取一些可能的多字节值,根据引脚更改位,然后将其写回。

C ++数组不具备成员函数。

要达到类似的效果,您应该拆分原始setOutput正在执行的工作:

  1. 阅读一些硬件配置
  2. 有点笨拙
  3. 应用更改
  4. 然后,您可以让多个引脚在应用最终输出之前进行纠缠。

    示例:

    Pin::Config cfg = Pin::read_config();
    // the following could also happen in a loop over an array.
    cfg = pin1.enableOutput(cfg);
    cfg = pin4.enableOutput(cfg);
    // or pass by reference and mutate, if you
    // want a less functional style
    // e.g. pinN.enableOutput(cfg)!
    Pin::write_config(cfg);
    

    这样你仍然有很好的封装,但更好的控制。然后,如果需要,您可以编写一个自由函数来操作数组,向量或任何引脚集合:

    template<typename It>
    void setOutputPins(It start, It end) {
      Pin::Config cfg = Pin::read_config();
      for (; start != end; ++start) {
        cfg = (*start).enableOutput(cfg);
      }
      Pin::write_config(cfg);
    };
    

    将它与C数组一起使用:

    Pin array[5]; // or a pointer for dynamic arrays
    // ...
    setOutputPins(array, array + size);
    

    不要做所有的事情。它会让你的生活更加艰难。

      

    [...]返回每个Pin [...]的偏移值的函数。然后我按位或者他们一起。

    所以你甚至不需要那个阅读步骤。既然你是按位或者他们,你甚至可以这样做:

    Pin::write_config(pin1.output_mask() | pin4.output_mask());
    

    你也可以使函数通用:或传递一个成员函数指针:

    template<typename It>
    void setPins(It start, It end, Pin::Config (Pin::*fn)(void)) {
      Pin::Config cfg = 0; // identity for bitwise or
      for (; start != end; ++start) {
        cfg |= ((*start).*fn)();
      }
      Pin::write_config(cfg);
    };
    

    并传递指向要调用的成员函数的指针:

    setPins(array, array + size, &Pin::asInput);
    

    Example here.