オブジェクトの依存関係に悩む

ゲームとなると、あるオブジェクトが一定の状態になったら別のオブジェクトを new して云々 なんてことが当たり前のようにありますがー

さて、クラス A, B, C とあり、それぞれ Compute() / Draw() を備えており、A-B-C の順で Compute() の後、A-B-C の順で Draw() が呼び出されるとします。

ここで、B::Compute が、A と C を new した時……


C は Draw の前に Compute が1回入るのに対して、A は Compute が1回も呼ばれずに Draw が呼ばれることになります。



………なんか、まずいよね。



仮の話、各オブジェクト N フェーズで delete this されるとした場合、オブジェクトは当然のごとくフェーズをカウントする変数を持つことになるかと思います。で、Compute 内部でそのカウンタをインクリメントしていくと。

やっつけコード的にはこんな感じかしらー


class A
{
  int m_nPhaseCount;
  int Compute()
  {
    if(++m_nPhase >= N)
      delete this;
  }
};


class B
{
  int m_nPhaseCount;
  int Compute()
  {
    if(m_nPhase == HOGE)
    {  // インスタンスを生成
       // オブジェクトは各クラス内のチェインに自動登録されるとする。
       new A, new C;
    }

    if(++m_nPhase >= N)
      delete this;
  }
};


class C
{
  int m_nPhaseCount;
  int Compute()
  {
    if(++m_nPhase >= N)
      delete this;
  }
};

同時に new しているはずなのに、C より A のインスタンスの方が 1フェーズ遅く削除される事に……

コードを書いている側としては*1「同時に new してるんだから、同時に delete されるだろう」とどうしても期待してしまう部分があるかと思うのですが、こんな状況だと非常にマズイ訳です。


…が、これ、具体的にどう対処するべきなんだろう…


オブジェクトの生成順番を全て把握してコーディングするべきなんでしょうか。…いやーでも、それってすげー大変ですよねぇ。

となると、いきなりオブジェクト管理チェインに挿入せずに、とりあえず一時的なバッファに溜め込んで置きつつ、全ての Draw が呼び終わった後にチェインに挿入しなおすコードを書く…べき…?

んー、どうするのが良いんだろう……。




……そもそも何か根本の部分で間違ってたりするのかしら…。^^;

*1:全て自分のコードではあるのですが…