Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dependency injection Arduino中的依赖注入_Dependency Injection_Arduino - Fatal编程技术网

Dependency injection Arduino中的依赖注入

Dependency injection Arduino中的依赖注入,dependency-injection,arduino,Dependency Injection,Arduino,我已经开始与Arduino合作,我想做一个分时系统,这样我就不用delay命令了 当我试图注册从另一个继承的对象时,我遇到了一个问题 在这里,我有一个测试代码,应该显示在终端上:“哇哇喵喵…” 当我尝试创建一个接口时,我有疑问,我如何声明register()函数,以便在动物类型数组中输入Cat和Dog对象 以下代码仅用于显示问题: class Animal { public: void message() { } }; class Dog : public Animal

我已经开始与Arduino合作,我想做一个分时系统,这样我就不用delay命令了

当我试图注册从另一个继承的对象时,我遇到了一个问题

在这里,我有一个测试代码,应该显示在终端上:“哇哇喵喵…”

当我尝试创建一个接口时,我有疑问,我如何声明register()函数,以便在动物类型数组中输入Cat和Dog对象

以下代码仅用于显示问题:

class Animal {
  public:
    void message() {

    }
};

class Dog : public Animal {
  public:
  void message() {
    Serial.println("Guau guau");
  }
};

class Cat : public Animal {
  public:
  void message() {
    Serial.println("Miau miau ");
  }
};

class Multiplex {
  private:
    int index = 0;
    Animal objects[5];
  public:

  void register(Animal object) {
    objects[index] = object;
    index++;  
  }

  void go() {
    for(int i = 0;i<index;i++) {
      objects[i].message();
    }
  }

};

Dog dog;
Cat cat;
Multiplex multiplex;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  multiplex.register(dog);
  multiplex.register(cat);

}

void loop() {
  // put your main code here, to run repeatedly:
  multiplex.go();
  delay(1000);

}
类动物{
公众:
无效消息(){
}
};
犬类:公共动物{
公众:
无效消息(){
序列号:println(“Guau Guau”);
}
};
猫类:公共动物{
公众:
无效消息(){
Serial.println(“Miau-Miau”);
}
};
类多路复用{
私人:
int指数=0;
动物物品[5];
公众:
无效登记册(动物对象){
对象[索引]=对象;
索引++;
}
void go(){

对于(int i=0;i,在本例中,您必须使用多态性(虚拟方法)。但它仍然无法处理动物基类中“已注册”对象的这么多副本(因为调用了
Animal::message()
,所以没有显示任何内容)。您必须使用指针(或引用-但在本例中并不容易)

class动物{//纯虚拟类(抽象类)
公众:
virtual void message()=0;//该'=0;'使整个类成为“纯虚拟的”
};
犬类:公共动物{
公众:
虚拟无效消息(){
序列号:println(“Guau Guau”);
}
};
猫类:公共动物{
公众:
虚拟无效消息(){
Serial.println(“Miau-Miau”);
}
};
类多路复用{
私人:
int指数=0;
动物*物体[5];
公众:
void reg(Animal*object){//传递指向该对象的指针
objects[index]=object;//对象必须始终有效
索引++;
}
void go(){
for(int i=0;imessage();
}
}
};
狗;
猫;
多路复用;
无效设置(){
//将安装代码放在此处,以便运行一次:
Serial.begin(9600);
multiplex.reg(&dog);
multiplex.reg(&cat);
}
void循环(){
//将主代码放在此处,以便重复运行:
多路复用。go();
延迟(1000);
}
如果您不喜欢动态多态性,那么必须使用诸如对象类型、开关和类型转换之类的东西来转换为正确的类型

class Animal { // pure virtual class (abstract class)
  public:
    virtual void message() = 0; // The '= 0;' makes whole class "pure virtual"
 };

class Dog : public Animal {
  public:
  virtual void message() {
    Serial.println("Guau guau");
  }
};

class Cat : public Animal {
  public:
  virtual void message() {
    Serial.println("Miau miau ");
  }
};

class Multiplex {
  private:
    int index = 0;
    Animal * objects[5];
  public:

  void reg(Animal * object) { // pass pointer to the object
    objects[index] = object;  // object must be valid for whole time
    index++;
  }

  void go() {
    for(int i = 0;i<index;i++) {
      objects[i]->message();
    }
  }

};

Dog dog;
Cat cat;
Multiplex multiplex;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  multiplex.reg(&dog);
  multiplex.reg(&cat);

}

void loop() {
  // put your main code here, to run repeatedly:
  multiplex.go();
  delay(1000);
}