2010-12-03 4 views
2

Je développe un jeu pour un cours dans mon école. Une des affectations est de permettre de sauvegarder le jeu dans un fichier et de charger ensuite le jeu à partir du même fichier.Enregistrer des pointeurs dans un fichier en C++

Le problème que j'ai est des pointeurs. Je n'alloue rien sur la pile (en raison de la propriété d'un élément par exemple) donc toutes les classes ont des pointeurs vers ce qu'elles veulent faire référence.

Bien que ce soit assez facile à résoudre (attribuer un identifiant à chaque objet et stocker cet identifiant au lieu du pointeur) le problème réel est livré avec l'héritage multiple.

Prenons la classe Acteur par exemple. Il ressemble à ceci: class Actor : public Object, public ItemOwnerObject est une classe de base Obj-C-style qui a un nombre de retenue et libérer, conserver et autorelease méthodes. ItemOwner est simplement une interface qui a des méthodes telles que virtual bool add(Item *item) = 0;, virtual void remove(Item *item) = 0; et virtual bool transfer_ownership(Item *item, ItemOwner *new_owner) = 0;

Maintenant la vraie question vient, quelle classe (es?) Devrait avoir des ID. Et Item a un pointeur sur ItemOwner alors qu'une Room a un pointeur vers un acteur. L'acteur ne doit être sauvegardé qu'une seule fois.

J'ai pensé à assigner des ID à chaque superclasse (Object, ItemOwner, etc) mais si j'ai un pointeur vers un acteur, cet acteur aura-t-il toujours la même adresse que l'objet (Actor *foo = new Actor(); foo == (Object *)foo)? Si ce n'est pas le cas, toutes les classes du jeu devront avoir un identifiant.

Toute idée ou suggestion serait grandement appréciée.

+2

Ceci tombe sous le thème de http://en.wikipedia.org/wiki/Serialization. – Sabuncu

+0

L'héritage multiple semble inutile ici. Est-ce que ItemOwner n'hérite pas non plus Object? – jwueller

+0

Eh bien, pas vraiment parce que si j'appelle Actor :: release(), il sera supprimé deux fois et ItemOwner est juste une interface –

Répondre

3

En utilisant UIDs, vous créez un mapping:

serialized_object -> UID -> deserialized_object. 

Pourquoi prendre la peine? Vous avez déjà des UID, et ce sont des pointeurs sur des objets. En utilisant cette application:

&serialized_object -> &deserialized_object 

vous laissez tomber un niveau d'indirection, tel que créé automatiquement UIDs, et tout ce que vous avez à faire est de déduire cette application dans le processus de deserealization.

La manière simpliest est de sérialiser les objets avec tous les pointeurs est, et de stocker en même temps que chaque objet son adresse. Cela vous aidera également à vérifier si un objet a été traité en série.

Alors que la sérialisation serait simple, la désérialisation aura ses astuces. Vous devrez faire attention à mettre à jour chaque vieux pointeur (rappelez-vous qu'ils contenaient des adresses qui ne sont plus valides) avec l'adresse d'objet correcte.

+0

Cette approche semble le plus simple ATM. J'ai créé une super super classe appelée Serializable qui imprime l'adresse des objets et en lisant je remplacerai plus tard tous les points par les adresses mises à jour. –

+0

Eh bien, en utilisant boost pourrait être plus facile et plus sûr. Mais étant donné que c'est pour l'école, il vaut mieux mettre en place votre propre cadre pour cela. – ruslik

+0

Cette approche semble bien fonctionner, mes premiers tests semblent très prometteurs. –

1

Une option consiste à définir une classe qui est but dans la vie est de tenir une pièce d'identité, et en faire une classe de base virtuelle de chaque classe vous avez l'intention d'enregistrer sur le disque.

+0

Ceci est en quelque sorte ce que je fais maintenant, j'ai une classe, Serializable, qui est le travail d'écrire la classe de cette pointeur et lire le vieux et faire la connexion à la nouvelle version –

0

je mettrais un seul par exemple l'objet, pour l'acteur, son ID doit être le même pour l'objet et ItemOwner, car ils sont tous la même instance.

En outre, au lieu d'utiliser des pointeurs vous pouvez penser à utiliser des gestionnaires, comme décrit ici: http://gamesfromwithin.com/managing-data-relationships

Questions connexes