-3

というクラスとActorというクラスがありBeastます。各andオブジェクト内にすべての and オブジェクトの配列が必要Beastです。したがって、 2 つの: andと 2 つの: andがあるとします。この同じ配列は、、および になります。ActorActorBeastActorsa1a2Beastsb1b2a1a1a2b1b2a2b1b2

この配列を作成するにはどうすればよいですか?

4

3 に答える 3

0

ここで解決すべき問題が 2 つあります。

  • まず、あなたの投稿から、異なるタイプ (Actor と Beast) を同じ配列に格納したいようです。これを行うことができるのは、両方の型が同じ基本クラスから派生している場合のみです。この場合、配列は基本クラスの要素へのポインターの配列である必要があります。(補足: クラスの命名方法のみに基づいて、Beast は Actor から派生する可能性があります。その場合、配列には Actor* 要素が含まれる可能性があります。)
  • 2 つ目の問題は、型の再帰です。アクターにビーストへの参照を持たせ、ビーストにアクタへの参照を持たせたいとします。Beast を最初に宣言せずに Actor クラスを完全に宣言することはできませんが、Beast も Actor を参照するため、Beast を最初に宣言することもできません。C++ では、クラスを「前方宣言」することで、このような再帰を解決できます。クラスを前方宣言すると、クラスが後で宣言されることをコンパイラに伝えますが、今のところ、有効なクラスとして受け入れる必要があります。前方宣言と完全な宣言の間では、クラスへのポインターを使用できますが (逆参照なしでのみ)、コンパイラーはクラスのサイズまたはメンバーがどうなるかをまだ認識できないため、ポインターのみを使用できます。両方のクラスを前方宣言するのは、次のように簡単です。

    クラス アクター; クラスビースト;

ただし、両方のクラスを別々の配列に格納せずに、基本クラスを使用して最初のポイントでソリューションを実装する場合は、共通の配列も基本クラスに格納する必要があり、転送する必要はありません。アクターとビーストを宣言します。

于 2013-10-30T14:47:51.060 に答える
0

Actors とBeasts の両方を同じ「配列」に保持するための条件がいくつかあります。これらは両方とも共通の基本型を共有する必要があり、配列はポインターの配列である必要があります。

その上、おそらく配列の代わりにベクトルを使用する必要があります。

1 つのパターンは、基本クラスの静的ベクターであり、派生クラスは、構築または破棄されたときにベクターから追加および削除できます。

class Base
{
protected:
    void Add( Base* in )
    {
        m_Vec.push_back(this);
    }
    void Remove( Base* in )
    {
        m_Vec.erase(find(m_Vec.begin(), m_Vec.end(), this));
    }
private:
    static vector<Base*> m_Vec;
};

class Actor : public Base
{
public:
    Actor()
    {
        Add( this );
    }
    ~Actor()
    {
        Remove( this );
    }
};

class Beast : public Base
{
        // do as in Actor
};
于 2013-10-30T14:27:30.030 に答える