0

だから、私がこれをやろうとしている理由の簡単な要約:

私は宇宙飛行プログラムを作成しています。(複数の船でコーディングすると) さまざまな船、たとえばクラフト [HAB]、クラフト [AYSE]、クラフト [ISS] などを格納できます。現時点では、1 隻の船でしかコーディングしていませんが、次のように宣言しています。

enum craft {HAB, CRAFTMAX};
...
[declaring ship class here]
...
ship craft[CRAFTMAX];

ただし、すべての船が同じ構造になるわけではありません。たとえば、HAB (Habitat の略) は円で、下部に 3 つのエンジン ポッドがあり、AYSE は中央にチューブがあり、ドッキング ライトなどがある宇宙ステーションになります。これらの関数がベクトルを画面に描画するようにしています。

現時点では、ship::draw を宣言しており、これを使用して Hab を描画しています。ただし、各描画関数を変更してその船を描画できるようにしたいと考えています。つまり、craft[AYSE].draw() は、craft[HAB].draw() とは異なる宣言を行います。

これを行うためのさまざまな方法を考え、調べましたが、あまり成功していません。重力と衝突の計算を容易にするために、すべてのクラフトを繰り返し処理できるようにしたいと考えています。しかし、関数が配列の要素であるときに関数を個別に宣言することが不可能である場合、各船を個別に宣言するのはそれほど面倒ではないと推測しています。

他のコードを見たい場合は、これを保存している私の git リポジトリを次に示します。これは独占プロジェクトであるため、少し組織化されていないことは間違いありません。

これをやろうとした人はいますか?きっとそこには何人かいるに違いない!

そして、前もって感謝します。

4

4 に答える 4

3

Shipオブジェクトの基本クラスを使用し、さまざまな種類の船のこの基本クラスから派生することで、はるかに優れていると思います。次に、すべての船のオブジェクトを反復処理してそれぞれの関数を呼び出すことができるコンテナを使用します。好き:

class Ship {
public:
  virtual void draw() const = 0;
};

class HAB : public Ship {
  virtual void draw() const;
};

class AYSE : public Ship {
  virtual void draw() const;
};

次に、次のようなコンテナを使用します。

vector<Ship> ships;
ship.insert(HAB());
ship.insert(AYSE());

// to draw
for_each(ships.begin(), ships.end(), mem_fn(&Ship::draw));

私はこれをかなり早く思いついたので、詳細を理解する必要があります。あなたがそれを行うことを考えている方法はあまりOOではなく、メンテナンスの面で問題があります(メンテナンスの単一ポイントを考えてください)。

于 2012-04-15T01:43:37.947 に答える
0

私はあなたのコードの見た目が好きではありません-タイプ識別子と変数識別子の両方としてワードクラフトを使用しています...

しかし、あなたの質問から、あなたは継承を使いたいようです。だからあなたは宣言します

class ship {
    // put here all methods that all ships have and that are the same
    // and all data that all ships.
    virtual void Draw( ) = 0; // subclasses of ship are forced to implement their own Draw
    // etc.
    };

船の配列が必要な場合は、出荷するポインターの配列にします。次に、サブクラスへのポインターを入れ、dynamic_cast必要なときにサブクラスへのポインターを戻すために使用できます。ただし、呼び出すことにより、配列の位置4にあるオブジェクトに適切なルーチンA[4]->Draw()を取得できます。Draw

于 2012-04-15T01:48:56.187 に答える
0

基本クラスを宣言し、各タイプの船を子クラスとして実装することをお勧めします。

class HAB: public ship{
  //code here
};

継承の詳細については、このチュートリアルを参照してください。

コロンはHAB、クラスからメンバーデータと関数を継承することを示していshipます。このようにして、基本クラスと重要な関数を共有しながら、各子クラスでいくつかの関数を一意に定義できます。たとえば、各船のタイプは、のような同様のメンバー関数を持っている可能性がありますget_position()が、描画関数は、特に各船のタイプに依存します。

ポリモーフィズムの利点は、子クラスを親クラスとして参照できることです。ship *したがって、子クラスの配列を参照するために(shipポインター)の配列を作成できます。

ship * array[CRAFTMAX];
array[0]=new HAB;

ただし、この種のものを使用する前に、管理を誤るとメモリリークが発生する可能性があるため、実際にポインタを確認する必要があります。つまり、メモリを割り当て、それを解放することはありません。

このウェブサイトには、ポリモーフィズムに関する優れた説明があります。

于 2012-04-15T01:50:01.773 に答える
0

OOの方法は、タイプの階層を作成することです。各タイプは、航空機のタイプの1つを表します。仮想関数を使用して、(基本クラスで宣言された)共通インターフェースにさまざまな実装を提供します。

これを取得したら、オブジェクトをコンテナに多態的に格納する必要があります(つまり、オブジェクトではなく、オブジェクトへのスマートポインタ)。(スマート)ポインターは、基本型と実際の型のオブジェクトになります。配列ではなく、より高いレベルのコンテナを使用することをお勧めします(つまりstd::vector<std::unique_ptr<ship>>

于 2012-04-15T01:50:59.313 に答える