Я написал анализатор файлов для игры, которую я пишу, чтобы мне было проще изменять различные аспекты игры (такие как данные персонажа / сцены / столкновения). Например, у меня может быть такой класс символов:
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
}
Это создаст две структуры данных и поместит их в карту <std::string, Character*>
, где ключевой строкой будет любое имя, которое я ей дал (в данном случае Sidekick и AwesomeDude). Когда мой анализатор видит указатель на класс, такой как указатель товарища по команде, он достаточно умен, чтобы посмотреть на карте, чтобы получить указатель на эту структуру данных. Проблема в том, что я не могу объявить товарища по команде Sidekick AwesomeDude, потому что он еще не помещен в карту персонажей.
Я пытаюсь найти лучший способ решить эту проблему, чтобы мои структуры данных могли ссылаться на объекты, которые еще не были добавлены на карту. Два самых простых решения, о которых я могу подумать: (а) добавить возможность пересылки объявляемых структур данных или (б) сделать синтаксический анализатор дважды прочитав файл, один раз, чтобы заполнить карту указателями на пустые структуры данных, и второй раз, чтобы пройти и заполнить их.
Проблема с (a) заключается в том, что я также могу решить, какой конструктор вызывать для класса, и если я перешлю декларацию чего-либо, мне нужно, чтобы конструктор был отделен от остальных данных, что может привести к путанице , Проблема с (b) заключается в том, что я могу объявить Sidekick и AwesomeDude в их собственных файлах. Мне нужно было бы сделать так, чтобы мой синтаксический анализатор мог принимать список файлов для чтения, а не по одному за раз (я думаю, это не так уж и плохо, хотя иногда мне может понадобиться получить список файлов для чтения из файл). (b) также имеет недостаток, заключающийся в невозможности использовать структуры данных, объявленные позже в самом конструкторе, но я не думаю, что это огромная сделка.
Какой способ звучит лучше? Есть ли третий вариант, о котором я не подумал? Кажется, что должно быть какое-то умное решение для этого со ссылками на указатели или связыванием или чем-то ...: / / Я предполагаю, что это несколько субъективно, исходя из того, какие функции я хочу дать себе, но любой ввод приветствуется.