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

C++;对象数组的构造方法 我在C++中创建了一个类。每个对象与微控制器上的I/O引脚相对应。我可以创建一个对象数组,然后使用for循环将每个管脚设置为一个输出。我希望能够设置多个引脚的输出在同一时间。这可以通过硬件实现,c++,arrays,class,oop,object,C++,Arrays,Class,Oop,Object,我正在尝试创建一个在对象数组上工作的方法。您可以这样使用它: Pin myPins[] = {0,1,2}; myPins.setOuput(); class Pins : public std::vector<Pin> { public: void setOutput() { /* your code here */ } }; Pin::write_config(pin1.output_mask() | pin4.output_mask()); 基本上,我想创建一个在

我正在尝试创建一个在对象数组上工作的方法。您可以这样使用它:

Pin myPins[] = {0,1,2};
myPins.setOuput();
class Pins : public std::vector<Pin>
{
public:
    void setOutput() { /* your code here */ }
};
Pin::write_config(pin1.output_mask() | pin4.output_mask());
基本上,我想创建一个在对象数组上工作的方法。可以创建这样的setOutput方法吗?如果是,如何进行?谢谢

更新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;
}
void setOutput(引脚[],int size){
易失性uint8_t*_DDR=引脚[0]。getDDR();
uint8_t_offset=0;
对于(int i=0;i

我正在名称中使用u,以便现有宏正常工作。不是很好,但是代码更少。

不,你不能按照你想要的方式向经典数组添加方法。但是,您可以创建一个继承自(例如)std::vector的类,并向其添加方法,如下所示:

Pin myPins[] = {0,1,2};
myPins.setOuput();
class Pins : public std::vector<Pin>
{
public:
    void setOutput() { /* your code here */ }
};
Pin::write_config(pin1.output_mask() | pin4.output_mask());
编辑:根据评论,子类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;
        }
    }
};

最有可能的是,您的
setOutput
成员函数正在读取一些可能的多字节值,根据管脚的不同更改一位,然后将其写回

C++数组不能有成员函数

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

  • 阅读一些硬件配置
  • 玩弄
  • 应用更改
  • 然后,您可以让多个管脚在应用最终输出之前进行位旋转

    例如:

    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);
    };
    
    不要把一切都搞得一团糟。这会让你的生活更艰难


    […]返回每个管脚[…]的偏移值的函数。然后我按位或将它们全部放在一起

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

    Pin myPins[] = {0,1,2};
    myPins.setOuput();
    
    class Pins : public std::vector<Pin>
    {
    public:
        void setOutput() { /* your code here */ }
    };
    
    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);
    };
    

    但是,派生一个不打算用作基类的类是危险的<代码>引脚
    '析构函数永远都不应该是琐碎的,我建议不要在这里进行子类化。这导致了一个非常严格的设计。在Pins类的setOutput函数中,如何访问每个Pin?我需要调用一个函数,返回向量中每个管脚的偏移值。然后我按位或将它们全部放在一起。在我的Pins类中,我没有办法销毁对象。因为它是在微控制器上使用的,所以实际上并不需要它。我不明白从vector继承的危害?这是一种快速而肮脏的方式。我对答案进行了编辑,以提供一个替代类,该类没有子类
    std::vector
    。在这个新类中,您可以使用
    mPins[i]
    访问PIN。如果您需要访问私有成员,只需使用一个非成员函数(例如:
    setOutput(myPins)
    )就可以了,您可以在Pin类中使其保持静态。我理解您的意思,我最初考虑创建一个自由函数,在该函数中输入一个Pin数组,它在数组中循环,并获取每个Pin的偏移量(我有一个获取偏移量的方法)并按位将它们相加,然后使用组合偏移量设置寄存器。我认为OO方法看起来更干净,但可能不值得使用。来源如下:因为我将要编写一系列免费方法(setInput、setOutput、setHigh、setLow等),我想尝试将它们分组在一个类中。除了切换版本(需要状态)我最新编辑的方法应该有效,我不认为切换是必要的,因为您可能不需要同时切换多个管脚。我用setOutput的新代码更新了我的问题。有没有比为每个方法编写这些块更好的方法呢?您只需要最后一个函数。然后传递一个指向所需成员函数的指针。