2

我正在为学校的一门课程开发游戏。其中一项任务是启用将游戏保存到文件,然后从同一文件加载游戏。

我遇到的问题是指针。我没有在堆栈上分配任何东西(例如,由于项目的所有权),因此所有类都有指向它们想要引用的任何内容的指针。

虽然这很容易解决(为每个对象分配一个 ID 并存储该 ID 而不是指针),但真正的问题来自多重继承。

让我们以Actor类为例。它看起来像这样:class Actor : public Object, public ItemOwner哪里Object是一个 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;

现在真正的问题来了,哪个类(es?)应该有ID。Item 有一个指向 ItemOwner 的指针,而 Room 有一个指向 Actor 的指针。演员应该只被保存一次。

我考虑过为每个超类(对象、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

一种选择是定义一个类,该类的生活目的是持有一个 ID,并使其成为您打算保存到磁盘的每个类的虚拟基类。

于 2010-12-03T11:54:07.977 回答
0

我会为每个对象放置一个实例,对于演员来说,它的 ID 对于 Object 和 ItemOwner 应该是相同的,因为它们都是同一个实例。

此外,您可以考虑使用处理程序,而不是使用指针,如下所述:http: //gamesfromwithin.com/managing-data-relationships

于 2010-12-03T12:02:35.450 回答