2016-12-09 11 views
0

私はArduinoで作業を始めました。私はtime shareシステムを使いたいので、delayコマンドは使用しません。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::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

関連する問題