数组、构造函数和实例

arrays, constructors and instances

本文关键字:实例 构造函数 数组      更新时间:2023-10-16

我解释我的问题:我正在尝试解决一个数组问题,我在OOP中完成了一个程序,其中它有一个名为lights的类。我想要做的是做一个内部有引脚编号的数组,并将它们设置为输出。我做了一个引脚一个引脚,这很容易做到,但现在我想用一个 for 循环和一个数组来做我不知道如何构建一个构造函数和处理它,其中包含一个带有数组的引脚编号。

    //----------------------------------------------------------------------------------
class lights{
  int pins[5]; //array for 5 elements
  int i; 
  public:
  lights(int ledPins[]){
    for(i=0; i<5; i++){     //pins are set up as output
      pinMode(pins[i],OUTPUT);
    }
  }//end constructor

  void attempt(){                        //metodo para pobrar si se enciende los leds
    for(i=0; i<5; i++){
      digitalWrite(pins[i],HIGH);
      Serial.println(pins[i]);
    }
  }//end attempt
};//end class
//---------------------------------------------------------------------------------------------------------------------

int MyPins[] = {5,6,7,8,9};        //I declare what it is inside
lights lit(MyPins);                 //I create an objet with my array as parameters
void setup(){
  Serial.begin(9600);
}
void loop(){
  lit.attempt();
}

你不需要把所有东西都放到一个类中。 我认为使用灯光类是矫枉过正的。

根据我的经验,函数用于处理光引脚,它们都需要引脚枚举。

除非您有大量的引脚要设置,否则循环可能不值得。 展开循环可能会提高程序效率:

pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
pinMode(7,OUTPUT);
pinMode(8,OUTPUT);
pinMode(9,OUTPUT);

初始化通常只发生一次,因此通常不需要优化。

如果需要使用类

,我建议使用一个对单个光源进行建模的类。

每个灯都有一个关联的引脚。

你可以有一个光源容器(例如数组(:

class Light
{
  public:  
    Light(unsigned int pin)
      : m_pin(pin),
        m_is_on(false)
    { ; }
    void initialize(); // Sets up the appropriate pin
    void on(); // Turns on the light
    void off(); // Turns off the light
    void blink(unsigned int rate, unsigned int duration);
  private:
     unsigned int m_pin;
     bool         m_is_on;
};
Light display[] = {Light(5), Light(6), Light(7), Light(8), Light(9)};
const unsigned int light_quantity =
    sizeof(display) / sizeof(display[0]);

此模型的一个优点是,您的程序可以在灯光方面,而不必担心引脚。

您的代码不起作用,因为您只是在编写代码,但没有先制定算法来设计应用程序......

花点时间看看你写的软件是什么...您正在向构造函数传递一个数组,但是您在哪里使用该信息? 无处。。。

 lights(int ledPins[]){
    for(i=0; i<5; i++){     //pins are set up as output
      pinMode(pins[i],OUTPUT);
    }
  }//end constructor

您将引脚设置为输出 Arduino {0 to 4}而不是像您想象的那样{5 to 9},之后环方法只是设置为可能甚至没有 LEds 的高电平引脚:)

(顺便说一下,您应该在那里使用睡眠和播放打开 LED 关闭,以便您可以看到它们如何闪烁(

我解决了这个问题:只缺少两行。我纠正了真正的构造函数

public:
  lights(int ledPins[]){
    for(i=0; i<5; i++){    
      pines[i] = ledPines[i];
    for(i=0; i<5; i++){     //pins are set up as output
      pinMode(pins[i],OUTPUT);
    }
  }//end constructor