Проблема проектирования с деревом информации в C ++ - PullRequest
1 голос
/ 14 сентября 2010

Заранее извините за длинное объяснение!

У меня есть приложение C ++, которое использует hash_map для хранения дерева информации, которое было проанализировано из текстового файла.Значения на карте являются дочерними hash_map или string.Эти значения были проанализированы из текстового файла и затем сохранены в карте.

Я хотел избежать отправки строк и карт в виде копии в функцию назначения хэш-карты, поэтому, когда файл был проанализирован, я создалуказатель на new string() или new hash_map() и сохранение значения на карте в виде «произвольных» данных (указатель на пустоту).

Однако это создает довольно большую проблему, когда дело доходит до очистки.вверх, поскольку удаление пустоты ведет себя не так, как хотелось бы (и это имеет смысл).Я искал простое решение, просто создав класс Object и сделав дочерние классы с именами StringObj и HashMap, в которых хранятся их соответствующие данные, и был вызван соответствующий деструктор, поскольку тип значения hash_map был изменен науказатель на Object.

Есть ли более простой способ решить эту проблему?Я посмотрел на динамическое приведение и подумал, что оно может работать хорошо, так как я могу поймать исключение из неудачного приведения и обработать его соответствующим образом, но я не могу не чувствовать, что может быть более простое решение или что я переборщилнемного усложнить.

Предложения?

Заранее спасибо, Jengerer

Ответы [ 2 ]

3 голосов
/ 14 сентября 2010

Используйте boost :: variable (что эквивалентно объединению C ++ для пользовательских типов), объединение C ++ (применимо в этом случае, когда вы работаете только с указателями) или boost :: any (которое может хранить любой тип ) для хранения указателя на hash_map или строку.

0 голосов
/ 14 сентября 2010

Еще один вариант - вы можете хранить std::pair<hash_map*, string*> для каждой записи в хэш-карте.Очевидно, установите для неиспользуемого указателя в каждой паре значение NULL, чтобы вы могли определить, какой используется, а какой нет.не нужны определения Object, StringObj и HashMap.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...