Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запись кучи полиморфных объектов на диск, Как бы кучу сохранить... 
V
    Опции темы
georain
  Дата 24.8.2007, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 193
Регистрация: 28.11.2006
Где: Санкт-Петербург

Репутация: нет
Всего: нет



Здравствуйте, подскажите пожалуйста.

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

Принцип работы виртуальных функций я знаю.
Возможно ли тут что-то с виртуальным адресным пространством?

Это сообщение отредактировал(а) georain - 24.8.2007, 20:43
PM MAIL   Вверх
MAKCim
Дата 24.8.2007, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



georain, 
создай виртуальные методы save() и load() и в каждом классе их реализуй



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
georain
Дата 24.8.2007, 21:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 193
Регистрация: 28.11.2006
Где: Санкт-Петербург

Репутация: нет
Всего: нет



Ну хотелось бы сразу всем скопом записать, просто у меня этих объектов под 1е9 smile
PM MAIL   Вверх
MAKCim
Дата 24.8.2007, 21:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



georain, 
в объектах полиморфных классов есть указатели на другие объекты (или что-то, чей реальный размер не известен изначально)?


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
georain
Дата 24.8.2007, 23:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 193
Регистрация: 28.11.2006
Где: Санкт-Петербург

Репутация: нет
Всего: нет



Нет, никаких указателей у классов нету, единственная проблема заключается в указателях на списки виртуальных функций.
PM MAIL   Вверх
Daevaorn
Дата 24.8.2007, 23:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(georain @  25.8.2007,  00:08 Найти цитируемый пост)
единственная проблема заключается в указателях на списки виртуальных функций. 

которых может и не быть вовсе;) Сохранять нудо не куски raw памяти,а объекты
Почитай про Serialization
PM MAIL WWW   Вверх
georain
Дата 26.8.2007, 00:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 193
Регистрация: 28.11.2006
Где: Санкт-Петербург

Репутация: нет
Всего: нет



Что-то я не очень понял как сериализация с полиморфными классами обходится,
Как в сохранённом объекте представлен тип класса?
Ведь при загрузке класса я не знаю его тип.

И если я хочу сам написать функцию сохранения для кажого класса отдельно,
как мне записать информацию о классе для его восстановления (но не имя класса smile )?
PM MAIL   Вверх
MAKCim
Дата 26.8.2007, 09:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



georain, 
фабрика объектов тебе поможет
тип может быть представлен числовой константой



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
bsa
Дата 26.8.2007, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(MAKCim @ 26.8.2007,  09:35)
georain, 
фабрика объектов тебе поможет
тип может быть представлен числовой константой

А можно и RTTI (typeid) воспользоваться.
PM   Вверх
MAKCim
Дата 26.8.2007, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



bsa, 
а как ты будешь восстанавливать объект?
с помощью typeid(...).name() можно записать в файл строку (которая идентифицирует класс объекта) непосредственно перед данными объекта
а как восстанавливать по строке?


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
zkv
Дата 26.8.2007, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



georain, может не изобретать велосипед?
Я пользуюсь МФСшной сериализацией, объекты "сами" восстанавливаются smile
можно юзать boost::serialization
Цитата(georain @  24.8.2007,  21:09 Найти цитируемый пост)
Ну хотелось бы сразу всем скопом записать, просто у меня этих объектов под 1е9

думаю здесь решающую роль будет играть время записи(чтения) на(с) диск(а). 
А в реализациях сериализаций уже продумана буферизация данных. (ужас, что сказал  smile )
PM MAIL   Вверх
JackYF
Дата 26.8.2007, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(zkv @  26.8.2007,  16:01 Найти цитируемый пост)
А в реализациях сериализаций уже продумана буферизация данных. (ужас, что сказал  smile ) 

классно, причем верно.

P.S. энтропия фрактальных систем неаддивна.

По сабжу - либо своя маленькая реализация, либо boost::serialization.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
georain
Дата 26.8.2007, 23:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 193
Регистрация: 28.11.2006
Где: Санкт-Петербург

Репутация: нет
Всего: нет



Цитата(MAKCim @  26.8.2007,  09:35 Найти цитируемый пост)
тип может быть представлен числовой константой

То есть я для каждого класса сам придумываю число?
Или может это число можно от куда-нибудь выдернуть?

boost::serialization штука хорошая, но несколько громозкая.

Хочу иметь одну функцию в базовом классе для сохранения в бинарном виде! smile
Размер получу из виртуальной функции my_size(), всё равно она уже есть.
Как же класс идентифицировать?  smile 
PM MAIL   Вверх
zkv
Дата 27.8.2007, 00:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



georain, советую посмотреть сначала сюда: Premature optimization и сюда: Reinventing the wheel.
После осмысления сюда: Factory, если останется желание велосипед доделывать smile

Добавлено через 2 минуты и 59 секунд
Цитата(georain @  26.8.2007,  23:17 Найти цитируемый пост)
boost::serialization штука хорошая, но несколько громозкая.

интересно стало, чем это она громоздкая? 
PM MAIL   Вверх
MAKCim
Дата 27.8.2007, 08:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(georain @  26.8.2007,  23:17 Найти цитируемый пост)
Как же класс идентифицировать?

Код

typedef base * (*constructor_t)();
constructor_t constructors[CLASSES_COUNT] = {
    A :: create,
    B :: create,
...
    Z :: create
};

enum {
    A_UNIQ_NUM = 0,
    B_UNIQ_NUM,
...
    Z_UNIQ_NUM
};

class A : public base {
public:
...
    static base * create() { return new A(); }
    virtual int uniq() const { return A_UNIQ_NUM; }
    virtual int size() const { return <size>; }
};

...





--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0616 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.