1

Sprite と PhysicsData という、まったく異なる 2 つの異なるオブジェクトがあるとします。

空の基本クラスと、コンテナーとの間でオブジェクトをプッシュおよび削除できるコンテナー クラスを作成します。

これらのコンテナーを 2 つ作成して、2 つの異なるオブジェクト (Sprite と PhysicsData) を格納します。(異なるオブジェクトが同じクラスにまとめられていません)

class base
{
};

class ContainerManager
{
public:
    std::vector<base*> list;
    void Push(base *object);
    void Remove(base *object);
};

class PhysicsData : public base
{
    void applyGravity();
};

class Sprite : public base
{
    void Draw();
};

ContainerManager SpriteContainer;
ContainerManager PhysicsDataContainer;

Sprite aSprite;
SpriteContainer.Push(&aSprite);

PhysicsData SomeData;
PhysicsDataContainer.Push(&SomeData);

これは、これが行われるべき方法ですか?

4

4 に答える 4

3

これはC++ の方法ではありません。テンプレートを使用する必要があります。

ご存知のように、STL(std::名前空間プレフィックスを使用するときに呼び出す)は、実際には標準テンプレートライブラリです:)。多くのテンプレート クラスが既に存在します。たとえば、プッシュ/削除操作については、次を参照してください。std::list<T>

次のように使用します。

std::list<Sprite> SpriteContainer;
std::list<PhysicsData> PhysicsDataContainer;

等々。

さらに機能を追加するために独自のクラスを作成したい場合は、C++ テンプレートに関するクールなガイドがあります。
そして、質問があなたがやりたかった実際のことであった場合、への参照がありstd::listます(の使用法を説明する必要はないと思います)。std::vector

于 2012-10-16T21:02:17.200 に答える
3

C++ でテンプレートを使用しているのに、単純なコンテナーに共通の基本クラスを使用することについてまだ心配していますか??

template <class T>
class Container{
  private:
    vector<T> list;
  public:
    void Push(T data);
    T Pop();
};
于 2012-10-16T21:02:41.440 に答える
1

単一の仮想関数を基本クラスに配置したdynamic_cast場合、同じコンテナーに異なるタイプを混在させると、適切なポインターを取り戻すために使用できるようになります。仮想デストラクタは、オブジェクトが動的に割り当てられている場合、元のポインタにキャストし直すことなくオブジェクトを削除できるため、良い考えです。

単一のコンテナ内でタイプを混在させる予定がない場合は、テンプレートクラスの方が優れているというdreamzorに同意します。これが、すべての標準コンテナの実装方法です。

于 2012-10-16T21:04:27.060 に答える
0

これは技術的に正しいコードのように見えますが、型チェックを行っていません。ご覧のとおり、SpriteContainer に PhysicsData が表示されています。あなたはおそらくこれを望まないでしょう。

SpriteContainer から PhysicsData を除外する方法は複数あります。1 つの方法は、テンプレートを使用することです。テンプレートを使用すると、コンパイル時にコンテナーが処理する必要がある基本オブジェクトのタイプを指定できます。

もう 1 つの方法は、ContainerManager から 2 種類の ContainerManagers を継承することです。1 つは PhysicsContainerManager と呼ばれ、もう 1 つは SpriteContainerManager と呼ばれます。これら 2 つの子クラスは型チェックを実行して、渡されるオブジェクトが実際に SpriteContainer または PhisicsData のいずれかであることを確認できます。このリンクは、instanceof に相当する C ++ C++ で型チェックを行う方法を示しています

ありがとうホセ

于 2012-10-16T21:20:50.650 に答える