| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > Как лучше хранить дерево. |
| Автор: a1ien 1.4.2011, 14:42 | ||
| Есть данные которые представляют из себя что-то типа дерева. Вобще это что-то типа QMap<Qstring,QMap<Qstring,....>>> и вот глубена неизвестна как такое хранилище реализовать, при этом конечный тип это скорее всего QVariant хочу как в интерпретируемых языках иметь доступ таким образом
|
| Автор: borisbn 1.4.2011, 15:10 | ||
используя в качестве значения map'а "себя" всё более или менее получается:
|
| Автор: a1ien 1.4.2011, 15:14 |
| хммм. да должно работать спасибо большое. |
| Автор: a1ien 3.4.2011, 00:21 | ||
Да вобщем то-что нужно. Но может можно как-то избавится от
Пробовал просто отнаследоватся от QVariant но что-то не так выходит( |
| Автор: borisbn 3.4.2011, 11:04 | ||||||||
зачем от оператора присвоения можно избавится, добавив ф-цию присвоения
но тогда вызов будет выглядеть не так элегантно
от QVariant val() можно избавиться, добавив
но не советую, т.к. операторы приведения - зло от QVariant m_value вообще не избавишься, т.к. хранить данные где-то надо... и ещё, я пропустил... в операторе присвоения Settings & operator= лучше использовать константную ссылку на QVariant, а не передачу по значению
P.S. Название у темы прикольное. Так и хочется ответить: "замотай корни в мокрую тряпку и храни при температуре 0...7 град" |
| Автор: a1ien 3.4.2011, 11:21 | ||
А почему нельзя отнаследовать от QVariant ? |
| Автор: borisbn 3.4.2011, 11:32 |
технически можно, но не советую, http://forum.vingrad.ru/forum/topic-322803.html |
| Автор: a1ien 3.4.2011, 11:33 | ||
| еще за одно. ) приходится вот таким извратом заниматся
иначе когда пишешь data["currentUser"]["currentstatus"].val().toString() возврящает пустую строку. Ну и с другими типами анологично |
| Автор: a1ien 3.4.2011, 12:07 | ||||||
Приведу чутка больше кода. Может бысть скажете еще где я неправ )) Это код моего http://en.wikipedia.org/wiki/Action_Message_Format парсера.
грубо говоря readObject() это основная функция. Самым первым типом почти всегда идет DT_OBJECT. Вот части readObject().
и использование
|
| Автор: borisbn 3.4.2011, 12:40 | ||
если так и было, то и при вызове нужно
и почему %3, а не %1 ? В общем, сделай простенький тест, и если не будет работать - тогда будем разбираться, а если у тебя в большой и сложной программе где-то что-то не отрабатывает, а в простом примере работает, то тут уж ... да поможет тебе отладчик |
| Автор: a1ien 3.4.2011, 12:51 | ||||
| %3 - просто это я когда тут постил удалил первые 2 длинны параметра. ) (*rObject)[className][k] нет там className уже ненужен UPD: код теперь такой
Есть строка
Mission /| res=double - это вывод |
| Автор: mes 3.4.2011, 12:57 | ||
|
| Автор: borisbn 3.4.2011, 13:29 | ||
| a1ien, здесь у тебя получается не дерево, а просто ствол одноуровневый map. Почему ["currentUser"]["currentMissionsCount"] должен что-то возвращать ? Вот если бы ты записал в (*rObject) сначала ["currentUser"], а затем в этот полученый класс в ["currentMissionsCount"] записал что-то, то смог бы и вытащить. А у тебя получилось, что ты записал что-то сначала в (*rObject)["currentUser"], а затем в (*rObject)["currentMissionsCount"]. Будь добр так и вытаскивай:
этот вариант видел, но так меньше завязка на КуТю. Заменив QMap на std::map, QString на std::string и QVariant на TVariant, можно в (прости меня Господи) Билдере использовать |
| Автор: a1ien 3.4.2011, 13:44 | ||
Потому-что выше properties[propertyName] = readData(); у нас в рекурсии все это идет тоесть readData() возвращает мапу. |
| Автор: a1ien 3.4.2011, 20:28 | ||||||||
Кстати вот так работает тоже.
при вот таком коде
а если делать как я показывал до, тоесть
то можно вот так писать
|
| Автор: mes 3.4.2011, 20:48 | ||||
имхо, намного удобнее будет такой вариант :
тогда строку можно получать извне.. или с формированием ключа из отдельных значений:
|