我为正在编写的游戏编写了一个文件解析器,以便我自己轻松更改游戏的各个方面(例如角色/阶段/碰撞数据)。例如,我可能有一个这样的字符类:
class Character
{
public:
int x, y; // Character's location
Character* teammate;
}
我设置我的解析器从文件中读取具有类似于 C++ 语法的数据结构
Character Sidekick
{
X = 12
Y = 0
}
Character AwesomeDude
{
X = 10
Y = 50
Teammate = Sidekick
}
这将创建两个数据结构并将它们放在一个 map<std::string, Character*>
中,其中键字符串是我给它的任何名称(在本例中为 Sidekick 和 AwesomeDude)。当我的解析器看到一个指向类的指针时,比如队友指针,它足够聪明,可以在地图中查找以获取指向该数据结构的指针。问题是我不能将 Sidekick 的队友声明为 AwesomeDude,因为它还没有被放置到 Character map 中。
我正在尝试找到解决此问题的最佳方法,以便我可以让我的数据结构引用尚未添加到地图中的对象。我能想到的两个最简单的解决方案是(a)添加转发声明数据结构的能力或(b)让解析器读取文件两次,一次是用指向空数据结构的指针填充映射,第二次是通过并填写它们。
(a) 的问题是我还可以决定在类上调用哪个构造函数,如果我转发声明某些内容,我必须让构造函数与其余数据分开,这可能会造成混淆。(b) 的问题是我可能想在他们自己的文件中声明 Sidekick 和 AwesomeDude。我必须让我的解析器能够读取一个文件列表,而不是一次读取一个文件(我猜这还不错,尽管有时我可能想从一个文件中读取一个文件列表文件)。(b) 还有一个缺点,就是不能使用稍后在构造函数本身中声明的数据结构,但我认为这没什么大不了的。
哪种方式听起来更好?有没有我没有想到的第三种选择?似乎应该通过指针引用或绑定或其他东西来解决这个问题...... :-/ 我想这有点主观,基于我想给自己的功能,但欢迎任何输入。