2016-12-09 4 views
0

Я начал работать с Arduino, и я хочу использовать систему совместного использования времени, поэтому я не использую команду delay.инъекция зависимостей в Arduino

У меня проблема при попытке зарегистрировать объекты, которые наследуются от другого.

Здесь у меня есть тестовый код, который должен показать в терминале: «Вау вау Miuau miuau ...»

У меня есть сомнения, когда я пытаюсь создать интерфейс и как объявить регистр функции() так что объекты Cat и Dog могут быть введены в массив типа Animal.

Следующий код только чтобы показать проблему:

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

Смежные вопросы