2016-11-03 5 views
1

J'ai un petit morceau de code Arduino qui me donne l'erreur de compilation:En utilisant des méthodes virtuelles avec Arduino

error: no matching function for call to 'PushButton::PushButton(int, LeftButtonEvent*) 

Dans son propre fichier d'en-tête j'ai deux classes:

class Event 
{ 
public: 
    virtual void handle() { 
    } 
}; 

class PushButton 
{ 
public: 
    PushButton(int pinButton, Event *event); 
    uint8_t read(); 
private: 
    uint8_t _buttonState; 
    Event _event; 
}; 

et le fichier source pour les classes:

PushButton::PushButton(int pinButton, Event *event) 
{ 
    // implementation 
} 

uint8_t PushButton::read() { 
    // implementation 

    return _buttonState; 
} 

Dans le fichier principal d'en-tête d'esquisse ino J'ai défini une nouvelle classe qui étend la classe Event:

class LeftButtonEvent : public Event { 
public: 
    virtual void handle(); 
}; 

Et dans le fichier source croquis que je fournis la mise en œuvre de la méthode de la poignée et l'utiliser:

void LeftButtonEvent::handle() { 
    log("Is working!!!!!"); 
} 

LeftButtonEvent leftButtonEvent; 
PushButton leftButton; 

void setup() {  
    leftButton = PushButton(PIN_LEFT_BUTTON, &leftButtonEvent); 
} 

Je me attendais le constructeur pour PushButton d'accepter un type de LeftButtonEvent car elle étend la classe de l'événement, mais il semble que ça ne l'aime pas. Ai-je raté quelque chose?

+0

Quel compilateur utilisez-vous. Cela devrait fonctionner. –

+0

Pouvez-vous créer un test comme 'struct Base {}; struct Derived: Base {} d; void f (Base * p) {}; int main {f (&d); return 0;} 'et voyez si cela fonctionne? ... et puis développez à partir de là –

+2

Vous essayez de créer un objet' PushButton' dans la ligne 'PushButton leftButton' sans spécifier d'arguments qui nécessite un constructeur par défaut sans paramètres.Vous n'avez pas un tel constructeur sur la classe 'PushButton' – Josef

Répondre

1

Comme il n'y a que le code incomplet et je ne pouvais pas tester directement, il est par exemple comment il est possible de le faire fonctionner (il est dans un sketch, Arduino IDE 1.6.12, C++ 11):

class Event { 
    public: 
    virtual void handle() = 0; 
}; 

class EventLeft : public Event { 
    public: 
    virtual void handle() { 
     Serial.println("EventLeft"); 
    } 
} leftEvent; 

class EventRight : public Event { 
    public: 
    virtual void handle() { 
     Serial.println("EventRight"); 
    } 
} rightEvent; 

class PushButton { 
    public: 
    PushButton(int8_t _pin, Event * _event) : pin(_pin), state(true), event(_event) { 
     pinMode(pin, INPUT_PULLUP); 
    } 

    void check() { 
     if (! digitalRead(pin)) { // inverted logic 
     if (state) event->handle(); 
     state = false; 
     } else { 
     state = true; 
     } 
    } 

    private: 
    int8_t pin; 
    bool state; 
    Event * event; 
}; 

PushButton buttons[] = { 
    {4, &leftEvent}, 
    {5, &rightEvent} 
}; 

void setup() {  
    Serial.begin(115200); 
} 

void loop() { 
    delay(10); 

    for (PushButton & button : buttons) button.check(); 
    //// if the range based for loop above doesn't work, you have to use old school one: 
    // for (uint8_t i = 0; i < 2; ++i) buttons[i].check(); 
} 
+0

Excepté pour la construction for-each, compile bien avec avr-gcc légèrement plus ancien, aussi. (arduino 1.6.7) – datafiddler

+0

C'est ce que je voulais réaliser. Cependant, j'avais des problèmes de compilation même avec votre code et apparemment le problème a été généré par Visual Micro avec Visual Studio Community 2015, je suis passé à AmtelStudio 7 et tout semble fonctionner. –