2010-12-03 6 views
2

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

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

これは非常に簡単です(各オブジェクトにIDを割り当て、ポインタの代わりにそのIDを格納する)が、実際の問題には複数の継承があります。

たとえば、Actorというクラスを考えてみましょう。これは次のようになります。class Actor : public Object, public ItemOwnerObjectは、保持カウントと解放、保持および自動解放メソッドを持つ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 *foo = new Actor(); foo == (Object *)foo)?そうでなければ、ゲーム内のすべてのクラスにIDが必要です。

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

+2

これはhttp://en.wikipedia.org/wiki/Serializationのトピックに該当します。 – Sabuncu

+0

複数の継承はここでは不要です。 'ItemOwner'も' Object'を継承しませんか? – jwueller

+0

Actor :: release()を呼び出すと2回削除され、ItemOwnerは単なるインターフェイスなので、本当にそうではありません。 –

答えて

3

UIDを使用することで、マッピングを作成しますか?すでにUIDを持っていて、これはオブジェクトへのポインタです。このマッピングを使用することにより:

&serialized_object -> &deserialized_object 

自動的に作成されたとして、あなたは、UIDを間接のレベルを落として、あなたがしなければならないすべてはdeserealizationプロセスでこのマッピングを推定することです。

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

シリアライズは簡単ですが、デシリアライズにはそのトリックがあります。あなたは古いポインタを更新することに注意しなければなりません(覚えていますか?もはや有効ではないアドレスを含んでいたことを覚えておいてください)。

+0

この方法は最も簡単なATMのようです。私はオブジェクトアドレスを出力するSerializableと呼ばれるスーパースーパークラスを作成しました。読み込み時には後ですべてのポイントを更新されたアドレスに置き換えます。 –

+0

さて、ブーストを使用する方が簡単で安全です。しかし、それが学校のためのものだと考えると、それのための独自のフレームワークを実装する方がはるかに優れています。 – ruslik

+0

このアプローチはうまくいくようですが、私の最初のテストはかなり有望です。 –

1

1つの選択肢は、IDを保持し、ディスクに保存するすべてのクラスの仮想基本クラスにすることです。

serialized_object -> UID -> deserialized_object. 

はなぜ悩ま:

+0

これは私が今やっていることのようなものです。私はクラスを持っています。シリアライズ可能です、クラスはこれを書くことです古いバージョンを読み込んで新しいバージョンに接続してください –

0

私はアクターのためにオブジェクトごとに1つのインスタンスを配置しますが、そのIDはすべて同じインスタンスであるため、ObjectおよびItemOwnerのIDは同じでなければなりません。ここで説明するように

はまた、代わりにポインタを使用してのあなたは、ハンドラを使用して考えることができます。 http://gamesfromwithin.com/managing-data-relationships

関連する問題