2016-11-03 12 views
1

で仮想メソッドを使用する:私は私のコンパイルエラーを与えるArduinoのコードの小片を持っているArduinoの

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

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

とソースファイル:独自のヘッダファイルで

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

を、私は2つのクラスを持っていますクラス:

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

uint8_t PushButton::read() { 
    // implementation 

    return _buttonState; 
} 

主なinoスケッチのヘッダーファイルでは、イベントクラスを拡張する新しいクラスを定義しました:

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

スケッチソースファイルに私がハンドルメソッドの実装を提供し、それを使用します。

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

LeftButtonEvent leftButtonEvent; 
PushButton leftButton; 

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

を私はそれがEventクラスを拡張するためLeftButtonEventタイプを受け入れるようにプッシュボタンのコンストラクタを期待していました、それはそれが好きではないように見えます。 何か不足していますか?

+0

どのコンパイラを使用していますか。それはうまくいくはずです。 –

+0

'struct Base {};のようなテストを作成できますか?構造体の導出:ベース{} d; void f(Base * p){}; –

+2

'PushButton leftButton'行に' PushButton'オブジェクトを作成しようとしていますが、これは引数を指定せずに 'パラメータを持たないデフォルトのコンストラクタです。あなたは 'PushButton'クラスにこのようなコンストラクタを持っていません。問題がありますか? – Josef

答えて

1

コードが不完全で、直接テストできなかったため、どのように動作させるかの例があります(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

for-each構造体を除いて、若干古いavr-gccでコンパイルしてください。 (arduino 1.6.7) – datafiddler

+0

これは私が達成したかったものです。しかし、私はあなたのコードでもコンパイルの問題を抱えていました。明らかにVisual Studio Community 2015でVisual Microによって生成された問題です.AmtelStudio 7に切り替えました。 –