1

これは、1 つの基本クラスの子クラスであるオブジェクトの配列が必要であるという私の最後の質問へのフォローアップです。dynamic_cast を試すように勧められましたが、このプロジェクトでは速度が非常に重要です。

これが本質的に私が求めているものです。

class Object
{
protected:
    int id;
};

class Bike: public Object
{
public:
    bike();

private:
    int bells;
};

class Car: public Object
{
public:
    void drive();

private:
    int wheels;
};

これらのオブジェクトの配列が必要なので、基本クラスを使用することにしました。

// Imagine I have 10 objects and don't know what they will be
Object* objects[10];

// Let's make the first object
objects[0] = new Car;

動的キャストは良いアイデアだと言われました。問題は、速度が重要であり、次のような操作を行う必要がある場合があることです。

  1. 8号車はインデックス値3のバイクを参照しています。

dynamic_casting を使用しない他の回避策はありますか?

編集:配列に多数の子クラスを設定した場合、特定のインデックスで子クラスのデータにアクセスするにはどうすればよいですか。言い換えれば、自転車がインデックス 8 にあると想像してください。配列とインデックスだけを使用して、そのオブジェクトから int ベルを取得するにはどうすればよいでしょうか。

4

4 に答える 4

1

他に何をしているかによって異なりますが、オブジェクト ポインターと共に格納しているオブジェクトの種類を指定する列挙を格納する構造体の配列を持つことができます。

いいえ:

class CObject;

enum EObjectType
{
    OT_Bike,
    OT_Car
};

struct SObjectInfo
{
    EObjectType Type;
    CObject* Object;
};

配列を反復処理するときは、オブジェクトの型を確認してから、オブジェクト ポインターを適切な派生型に静的にキャストできます。私はこのアプローチを、避けられず、汎用コンテナー内でオブジェクト タイプの実行時の識別が絶対に必要な場合に広く使用します。

ポリモーフィズムや仮想メソッドを使用せずに、異なるクラスのオブジェクトを同じ配列に格納する必要があるのはなぜでしょうか?

于 2012-09-22T09:28:24.470 に答える
0

オブジェクトが異なる場合、なぜ基本クラスがあるのですか?このリンクは役立つかもしれません:http://www.codeproject.com/Articles/23304/High-Performance-Heterogeneous-Container

于 2012-09-22T09:23:51.527 に答える
0

実装がどのように見えても、問題には実行時のオーバーヘッドが必要なようです。これは、ある時点で、プログラムが実際に格納する型を決定する必要があるためです。Boost を使用する余裕がある場合は、少し人工的な継承を導入するための代替手段がさらにあることに注意してください。

  • Boost.Variant - 保存するすべてのタイプが事前にわかっている場合
  • Boost.Any - ない場合
于 2012-09-22T09:42:16.117 に答える
0

まず第一に、非常に高速にする必要がある場合は、演算子 new を使用してヒープに作成しないでください。可能であれば、ローカルで作成する必要があります。

オブジェクトが常に存在することが確実な場合は、キャストを static_cast に変更できます。これは、はるかに高速なソリューションです。

私にとって、ここでの最良のアイデアは、純粋な仮想メソッドでインターフェイスを使用することです。お気に入り:

Class Objects //interface
{
public:
   virtual void ride() = 0;
}

次に、インターフェイスを基本クラスとして使用します。プログラミングではよくあることです。

于 2012-09-22T09:28:55.333 に答える