2016-12-09 101 views
0

我已经开始使用Arduino了,我想要做一个时间共享系统,所以我不使用延迟命令。Arduino中的依赖注入

我尝试注册从另一个继承的对象时遇到问题。

在这里,我有一个测试的代码应该在终端显示:“哇哇Miuau miuau ......”

我怀疑,当我尝试创建一个接口,我怎么申报寄存器()函数使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); 

} 

欢迎任何帮助......

感谢和抱歉,我的英语水平。

回答

1

在这种情况下,你必须使用多态(虚拟方法)。但是它仍然不能与“注册”对象的许多副本一起使用到Animal基类中(因为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); 
} 

如果你不喜欢的动态多态,你必须使用类似对象类型,开关和类型转换到正确的类型。

+0

正是我在找的东西。工作正常。谢谢!!! – hazardco