というクラスとActor
というクラスがありBeast
ます。各andオブジェクト内にすべての and オブジェクトの配列が必要Beast
です。したがって、 2 つの: andと 2 つの: andがあるとします。この同じ配列は、、および になります。Actor
Actor
Beast
Actors
a1
a2
Beasts
b1
b2
a1
a1
a2
b1
b2
a2
b1
b2
この配列を作成するにはどうすればよいですか?
ここで解決すべき問題が 2 つあります。
2 つ目の問題は、型の再帰です。アクターにビーストへの参照を持たせ、ビーストにアクタへの参照を持たせたいとします。Beast を最初に宣言せずに Actor クラスを完全に宣言することはできませんが、Beast も Actor を参照するため、Beast を最初に宣言することもできません。C++ では、クラスを「前方宣言」することで、このような再帰を解決できます。クラスを前方宣言すると、クラスが後で宣言されることをコンパイラに伝えますが、今のところ、有効なクラスとして受け入れる必要があります。前方宣言と完全な宣言の間では、クラスへのポインターを使用できますが (逆参照なしでのみ)、コンパイラーはクラスのサイズまたはメンバーがどうなるかをまだ認識できないため、ポインターのみを使用できます。両方のクラスを前方宣言するのは、次のように簡単です。
クラス アクター; クラスビースト;
ただし、両方のクラスを別々の配列に格納せずに、基本クラスを使用して最初のポイントでソリューションを実装する場合は、共通の配列も基本クラスに格納する必要があり、転送する必要はありません。アクターとビーストを宣言します。
Actor
s とBeast
s の両方を同じ「配列」に保持するための条件がいくつかあります。これらは両方とも共通の基本型を共有する必要があり、配列はポインターの配列である必要があります。
その上、おそらく配列の代わりにベクトルを使用する必要があります。
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
};