-1

これは Arduino プロジェクトで、モード ボタンがあります。このボタンは、現在のアプリケーション変数を player/radio/navigation/phone に変更します。すべてのアプリケーションは「App」から継承されます。

「apps[0]->volume_up();」を実行すると、アプリケーションにメソッド volume_up がないと叫ぶ。アプリに追加すると、プレーヤーではなくアプリで volume_up が実行されます。

私は何を間違っていますか?

int index = 0;
App *apps[4];

void setup(){
    Player *player = new Player();
    Radio *radio = new Radio();
    Navigation *navigation = new Navigation();
    Phone *phone = new Phone();
    apps[0] = player;
    apps[1] = radio;
    apps[2] = navigation;
    apps[3] = phone;
}

void loop(){
    int sensorValue = analogRead(A0);

    if (sensorValue == 156 || sensorValue == 157){ // Mode button
        index = (index + 1) % (sizeof(apps)/sizeof(apps[0]));
        delay(300);
    }

    if (sensorValue == 24 || sensorValue == 23){ // Volume button
        apps[index]->volume_up();
        delay(100);
    }
}

編集

#ifndef App_H
#define App_H

#include "Arduino.h"

class App {
    public:
        void volume_up();
    };

#endif


#include "App.h"

void App::volume_up(){
    Serial.println("VOLUME_UP");
}
4

1 に答える 1

0

親からメソッドを呼び出す場合App::volume_up()は、サブクラスのメソッドで使用します。virtualまたは、メソッドを次のようにマークします

virtual void App::volume_up(){ }

サブクラスで呼び出すことができます。

AppクラスPhoneなどでクラスを継承する必要があります。

class Phone : public App {

};

次に、

 void Phone::volume_up() { App::volume_up(); }

仮想メソッドを使用しない場合、または

 void Phone::volume_up() { //Phone implementation }

仮想メソッドを使用する場合。

ランタイムポリモーフィズムを使用するには、実行したようにポインターを作成する必要があります。

ウィキペディアの記事「仮想関数とスタックオーバーフローの質問」を参照してください。C++基本クラスメソッドを自動的に呼び出します

于 2013-03-09T13:02:45.577 に答える