2

学校のコース用にゲームを開発しています。割り当ての 1 つは、ゲームをファイルに保存し、後で同じファイルからゲームをロードできるようにすることです。

私が抱えている問題はポインターです。私はスタック上に何も割り当てていません (たとえば、アイテムの所有権のため)。そのため、すべてのクラスは、参照が必要なものへのポインターを持っています。

これは非常に簡単に解決できますが (各オブジェクトに ID を割り当て、ポインターの代わりにその ID を保存します)、実際の問題は多重継承に伴います。

クラス Actor を例にとってみましょう。これは次のようになります: class Actor : public Object, public ItemOwnerwhereObjectは、retain count と release、retain および autorelease メソッドを持つ Obj-C スタイルの基本クラスです。ItemOwner は、virtual bool add(Item *item) = 0;、 、virtual void remove(Item *item) = 0;およびvirtual bool transfer_ownership(Item *item, ItemOwner *new_owner) = 0;

さて、本当の問題は、どのクラス (複数可?) に ID が必要かということです。また、Item には ItemOwner へのポインターがあり、Room には Actor へのポインターがあります。アクターは一度だけ保存する必要があります。

各スーパークラス (Object、ItemOwner など) に ID を割り当てることを考えましたが、Actor へのポインタがある場合、そのActor は常に含まれる Object と同じアドレスを持ちます(Actor *foo = new Actor(); foo == (Object *)foo)か? ゲーム内のすべてのクラスに ID が必要になるわけではありません。

ご意見やご提案をいただければ幸いです。

4

3 に答える 3

3

UID を使用して、マッピングを作成します。

serialized_object -> UID -> deserialized_object.

なぜ面倒?すでに UID があり、これらはオブジェクトへのポインターです。このマッピングを使用すると、次のようになります。

&serialized_object -> &deserialized_object

UID は自動的に作成されるため、間接的なレベルを削除します。必要なのは、デシリアライゼーション プロセスでこのマッピングを推測することだけです。

最も簡単な方法は、すべてのポインターをそのまま使用してオブジェクトをシリアル化し、各オブジェクトと共にそのアドレスを格納することです。これは、オブジェクトがすでにシリアル化されているかどうかを確認するのにも役立ちます。

シリアライゼーションは単純ですが、デシリアライゼーションにはコツがあります。それぞれの古いポインター (覚えていますか? それらにはもはや有効ではないアドレスが含まれていました) を正しいオブジェクト アドレスで更新するように注意する必要があります。

于 2010-12-03T12:02:17.040 に答える
1

1 つのオプションは、ID を保持することを目的とするクラスを定義し、それをディスクに保存するすべてのクラスの仮想基本クラスにすることです。

于 2010-12-03T11:54:07.977 に答える
0

アクターの場合、オブジェクト インスタンスごとに 1 つ配置します。その ID は、オブジェクトと ItemOwner で同じでなければなりません。それらはすべて同じインスタンスだからです。

また、ポインターを使用する代わりに、ハンドラーの使用について考えることができます。

于 2010-12-03T12:02:35.450 に答える