Arduino中的依赖注入

扎尔科

我已经开始使用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);

}

欢迎任何帮助...

谢谢你,我的英语不好意思。

基辅

在这种情况下,您必须使用多态(虚拟方法)。但是,它仍然无法与动物基类中的这么多“已注册”对象的副本一起使用(因为Animal::message()被调用,它没有显示任何内容)。您必须使用指针(或引用-但在这种情况下并不是那么容易)

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);
}

如果您不喜欢动态多态性,则必须使用诸如对象类型之类的东西,将其切换和类型转换为正确的类型。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章