0

私はいくつかのArduinoコードを書いていて、いくつかのクラスで継承を使用しようとしています。クラス「Actor」(私の基本クラス)とクラス「Marble」(Actorから継承)があります。ヘッダーファイルは次のとおりです。

Actor.h:

#ifndef Actor_h
#define Actor_h

#include "Arduino.h"

class Actor
{
  public:
    Actor();
    void speak();
  private:
};
#endif

Marble.h:

#ifndef Marble_h
#define Marble_h

#include "Arduino.h"
#include "Actor.h"

class Marble : public Actor {
  public:
    Marble();
    virtual void speak();    
  private:
};
#endif

Actor.cpp:

#include "Arduino.h"
#include "Actor.h"

Actor::Actor()
{
}

void Actor::speak() {
  Serial.println("Actor"); 
}

Marble.cpp:

#include "Arduino.h"
#include "Marble.h"

void Marble::speak() {
  Serial.println("Marble"); 
}

そして最後に、ループ関数で次のことを行います。

void loop() {
  Marble marble;
  Actor children[2];
  children[0] = marble;

  children[0].speak();

その結果、「Actor」が印刷されます。

私の問題に似ているように見えるこの素敵なリンクを発見しましたが、解決策は私にはうまくいかないようです: http ://arduino.cc/forum/index.php?topic=41884.0

それで。「アクター」の配列を作成し、そこにマーブルを貼り付けようとすると、アクターなどにキャストされるようです。問題は、すべて「Actor」から継承するいくつかの異なるキャラクターがあり、それらの配列を繰り返し処理して、オーバーライドされたメソッドを呼び出すことです。

それで、おそらく問題は私がこの問題にどのように取り組んでいるのか、あるいはいくつかの構文エラーがあるのでしょうか?知らない!

助けてくれてありがとう、ケビン

4

2 に答える 2

4

クラスだけでなく、クラスのspeakように宣言する必要があります。それがないと、は仮想関数であるため、常に仮想よりも優先して呼び出されます。virtualActorMarbleActor::speakMarble::speak

価値があるのは、これはArduinoとは何の関係もありません。それは単なるC++の問題です。

于 2013-02-14T20:10:18.373 に答える
0

あなたの問題はそれchildrenが型の配列であるということですActor。この行children[0] = marbleはオブジェクトを取得し、Marbleそれをオブジェクトに変換してActor、結果をにコピーしていますchildren[0]。の呼び出しchildren[0].speak()はであるActorため、バージョンを取得しますActor

これが希望どおりに機能するためには、オブジェクト自体ではなく、オブジェクトへのポインタまたは参照をコピーする必要があります。つまり、 `Actor * children[2]'のようなものが必要です。

Marble marble;
Actor* children[2];
children[0] = &marble;

children[0]->speak();

もちろん、children範囲外のスコープがある場合loop、これは完全に失敗newし、ビー玉を作成するために使用する必要があります。

さらに良いことに、ArduinoにSTLがあると仮定するvectorと、shared_ptrまたは同様のものを使用する必要があります。

speak[更新]Philipが指摘しているように、これには、メソッドActorが仮想として宣言されている必要もあります。

于 2013-02-14T20:46:42.493 に答える