私は現在、C ++でゲームに取り組んでいます。ガベージ コレクターがないため、オブジェクトを常に慎重に削除し、削除されたオブジェクトがアクセスされないようにする必要があります。
プロジェクトが成長するにつれて、いくつかのオブジェクトがますます多くの場所から参照されるようになります。たとえば、ゲーム内のユニットは、レンダラー、シーン階層、選択メカニズム、HUD などから参照される場合があります。現在 - オブジェクトが削除された場合、このオブジェクトを参照する他のすべてのクラスに通知されるようにする必要があります。
または、逆に言えば、ユニットの1つを参照する可能性のある新しいクラスを作成する場合、ユニットのコード(またはユニットマネージャーまたはユニットを削除するモジュールのコード)も変更する必要があります。この新しいモジュールが、現在参照している特定のユニットがいつ削除されるかを確実に認識できるようにします。
今、私は、別のオブジェクトがサブスクライブできるベースクラスを作成することにより、この問題を解決するための単純なイベント駆動型の汎用アプローチがあると考えています。このようなもの:
class DeletableBase;//forward declaration
class ISubscriber{
public:
virtual someObjectGotDeleted(DeletableBase* deletedObject)=0;
};
class DeletableBase{
private:
vector<ISubscriber*> subscribers;
public:
virtual ~DeletableBase(){
for(int i=0; i<subscribers.size(); i++)
subscribers[i]->someObjectGotDeleted(this);
}
subscribeForDeleteEvent(ISubscriber* subscriber){
subscribers.push_back(subscriber);
}
};
それで、新しいクラスからこのクラスを継承するオブジェクトを参照する場合、自分自身をサブスクライバーとして追加するだけで、オブジェクトが他の場所から削除される場合、それについて通知されます。
これは「クリーンな」コーディング方法ですか?