Ошибка при работе с boost::any |
Здравствуйте, гость ( Вход | Регистрация )
Ошибка при работе с boost::any |
AD |
9.8.2009, 21:12
Сообщение
#1
|
Профессионал Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: 17 |
Почему-то вылетает с ошибкой при работе со следующим кодом:
Правда, структуры не имеют конструкторов, но это код библиотеки:
Отладчик выпадает на следующие строки:
Как можно исправить ошибку? |
|
|
BRE |
10.8.2009, 7:59
Сообщение
#2
|
Профессионал Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: 44 |
sizeof( any ) == 4, т.е. он хранит указатель на внутренний объект (content)!
Читая file.read((char*)&_types[key], sizeof(_types[key])) ты этот указатель затираешь первыми четырьмя байтами из файла. При разрушении any программа падает. Все логично. Обрати внимание на any_cast<Type>(...)!!! |
|
|
AD |
10.8.2009, 8:12
Сообщение
#3
|
Профессионал Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: 17 |
Цитата sizeof( any ) == 4, т.е. он хранит указатель на внутренний объект (content)! Читая file.read((char*)&_types[key], sizeof(_types[key])) ты этот указатель затираешь первыми четырьмя байтами из файла. При разрушении any программа падает. Все логично. Обрати внимание на any_cast<Type>(...)!!! А как именно поправить я не понял? Прости, если донимаю... |
|
|
BRE |
10.8.2009, 8:20
Сообщение
#4
|
Профессионал Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: 44 |
А как именно поправить я не понял? Прости, если донимаю... Примерно так:
|
|
|
AD |
11.8.2009, 8:26
Сообщение
#5
|
Профессионал Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: 17 |
Примерно так: Спасибо. А вопрос такой, а можно ли это сделать так, чтобы при добавлении, например, еще какого-то типа данных, ну например топографии другого формата, не надо было бы еще одну ветку else делать? Т.е. смысл-то этого вектора с any, чтобы он автоматом определял тип, а не при непосредственном приведении. |
|
|
BRE |
11.8.2009, 12:17
Сообщение
#6
|
Профессионал Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: 44 |
Примерно так: Спасибо. А вопрос такой, а можно ли это сделать так, чтобы при добавлении, например, еще какого-то типа данных, ну например топографии другого формата, не надо было бы еще одну ветку else делать? Т.е. смысл-то этого вектора с any, чтобы он автоматом определял тип, а не при непосредственном приведении. Поэтому я тебе и написал, что не могу понять для чего ты все это делаешь. Теперь понял. IMHO any не очень подходит для таких задач. Можно попробовать получать имя типа из type_info, но все равно придется городить свой if для каждого типа. При добовлении нового типа, нужно будет дописывать свою ветвь. Может лучше воспользоваться фабриками. Для каждого типа карты делается специальный класс loader, который умеет ее загружать. Все они регистрируются в фабрике и она создает объект-загрузчик в зависимости от указанного типа. |
|
|
AD |
11.8.2009, 12:22
Сообщение
#7
|
Профессионал Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: 17 |
Поэтому я тебе и написал, что не могу понять для чего ты все это делаешь. Теперь понял. IMHO any не очень подходит для таких задач. Можно попробовать получать имя типа из type_info, но все равно придется городить свой if для каждого типа. При добовлении нового типа, нужно будет дописывать свою ветвь. Может лучше воспользоваться фабриками. Для каждого типа карты делается специальный класс loader, который умеет ее загружать. Все они регистрируются в фабрике и она создает объект-загрузчик в зависимости от указанного типа. Об этом подумал. Какой класс буста использовать? Как приблизительно это можно реализовать? Спасибо за помощь!!! |
|
|
BRE |
11.8.2009, 18:14
Сообщение
#8
|
Профессионал Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: 44 |
Об этом подумал. Какой класс буста использовать? Как приблизительно это можно реализовать? Спасибо за помощь!!! Мне понравилось одно решение с фабриками (подсмотрел на Inside C++). Я его немного переделал, что бы в качестве ключа можно было использовать не только строки. Раскрывающийся текст
Как это использовать: Раскрывающийся текст
Сообщение отредактировал BRE - 11.8.2009, 19:07 |
|
|
Текстовая версия | Сейчас: 22.11.2024, 9:08 |