1

同時に 2 つの異なる動作を表すクラスを作成しようとしています。次のように:

class IMouse {
public:
    virtual void Walk() const = 0;
};

class TSimpleMouse : public IMouse {
public:
    void Walk() const;
};

class IBat {
public:
    virtual void Fly() const = 0;
};

class TSimpleBat : public IBat {
public:
    void Fly() const;
};

template <class TMouse, class TBat>
class TSuperCreatureImpl {
public:
    void Do() const {
        Walk();
        Fly();
    }
};

typedef TSuperCreatureImpl<TSimpleMouse, TSimpleBat> TSimpleSuperCreature;

さまざまな typedef を作成したいので、これはデフォルト (メソッド Do) による動作を持つことが重要です。とてもシンプルに思えます。

しかし、メソッド Fly と Walk にもパラメーター (速度など) を持たせたいと考えています。さまざまな生物に多くの typedef を使用できるようにするには、アーキテクチャをどのように変更すればよいですか?

Mouse と Bat のデフォルトのコンストラクターがない場合、アーキテクチャを変更するにはどうすればよいですか?

どうもありがとう。

4

3 に答える 3

3
template <class TMouse, class TBat>
class TSuperCreature : public TMouse, public TBat
{
  public:
    void do() const {
        this->walk();
        this->fly();
    }
};

ただし、FlyメソッドとWalkメソッドにもパラメーター(速度など)を持たせたいと思います。さまざまなクリーチャーに多くのtypedefを使用する機会を得るために、アーキテクチャをどのように変更する必要がありますか?どうもありがとう。

関数にデフォルトのパラメータを与えることができます...

virtual void Walk(double meters_per_second = 1.1) const = 0;

編集

(以下のコメントから)2つのクリーチャーが必要だと想像してください。最初のクリーチャーは速く歩き、ゆっくりと飛んでいきます。2番目のクリーチャーはその反対です。つまり、2つのtypedefを作成する必要があります。しかし、ここで速度定数を使用する方法がわかりません。アーキテクチャのどの部分にパラメータが必要ですか?

1つのオプションは、次のようなことを行うことです。

template <class TMouse, class TBat, int walk_speed, int fly_speed>
class TSuperCreature : public TMouse, public TBat
{
  public:
    void do() const {
        this->walk(walk_speed);
        this->fly(fly_speed);
    }
};

sを使用する場合はdouble、テンプレート引数として使用することはできません(少なくとも、C ++ 03では許可されていません)が、ハックとして、数値のペアを受け入れてテンプレート内で分割するか、より適切に提供することができます。ポリシークラス...

template <class TMouse, class TBat, class Speeds>
class TSuperCreature : public TMouse, public TBat
{
  public:
    void do() const {
        this->walk(Speeds::walk_speed);
        this->fly(Speeds::fly_speed);
    }
};

struct Speeds__Fly_Fast__Walk_Slow   // yes I know double underscores are reserved - I don't care!
{
    static const double walk_speed = 0.5; // m/s
    static const double fly_speed = 10;
};
于 2012-06-08T15:48:34.770 に答える
1

単純化してみませんか。

移動方法をパラメータとして使用する移動インターフェイスを用意します。

enum MovementMethod { Walk, Fly, Swim };

class MoveInterface
{
    public:
        virtual void move(MovementMethod method) = 0;
};
// TMouse/TBat inheret from the MoveInterface

template <class TMouse, class TBat>
class TSuperCreatureImpl : public TMouse, public TBat
{
    public:
        virtual void move(MovementMethod /*method*/) 
        {
            TMouse::move(Walk);
            TBat::move(Fly);
        }
};
于 2012-06-08T15:51:34.590 に答える
0

一度に 1 つの特別な動作のみが必要な場合は、戦略パターンを適用します。Do-Method は、現在の戦略 (歩くか飛ぶか) を呼び出すだけです。必要なときに選択される CurrentBehaviour を持つことができます。

さらに、デコレーターを考えて、必要なときに必要な動作を簡単に追加します。つまり、スーパークリーチャーが必要な場合は、動作のコレクションがあり、マウスとバットを追加します。吠えることもできるスーパークリーチャーが必要な場合は、犬の振る舞いを追加するだけです。

于 2012-06-08T15:54:05.533 に答える