我已经开始使用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] 删除。
我来说两句