Здравствуйте Аноним, Вы писали:
А>Подскажите пожалуйста ,есть ли возможность средствами MFC
А>хранить данные в файле в виде дерева.
А>Причем предполагаетса возможность добавления новых вершин.
В смысле сериалтзовать древовидную структуру?
Можно.
Например так- если узел дерева это объект , содержаший в себе массив указателей на потомки,
то достаточно определить функцию сериализации этого массива , после чего сериалтзоввывать себя и затем детей. Что в свою очередь сериализуеи дейтей и их детей и так далее.
Таим образом запись дерева будет такой
archive << pBaseObject;
Чтение — аналогично.
Будут вопросы — поделюсь конкретными классами и подводными камушками.
Саша.
Здравствуйте Sasparella, Вы писали:
S>Здравствуйте Аноним, Вы писали:
А>>Подскажите пожалуйста ,есть ли возможность средствами MFC
А>>хранить данные в файле в виде дерева.
А>>Причем предполагаетса возможность добавления новых вершин.
S>В смысле сериалтзовать древовидную структуру?
S>Можно.
S>Например так- если узел дерева это объект , содержаший в себе массив указателей на потомки,
S>то достаточно определить функцию сериализации этого массива , после чего сериалтзоввывать себя и затем детей. Что в свою очередь сериализуеи дейтей и их детей и так далее.
S>Таим образом запись дерева будет такой
S>S>archive << pBaseObject;
S>
S>Чтение — аналогично.
S>Будут вопросы — поделюсь конкретными классами и подводными камушками.
S>Саша.
Спасибо. Это все конечно очень хорошо.
Но записать мне надо для того,чтобы через одну-две недели восстановить это
самое дерево.
Если записать как ты предлагаешь(если я тебя правильно понял)
class Vertex
{
public:
// .......
private:
//.......
std::vector<Vertex> * children;
};
А затем сериализовать вектора и вершины;
Но когда я попробую считать(после неодной перезагрузки) я не смогу
восстановить структуру дерева т.к.
сохраненные указатели на детей уже
не будут таковыми(узлы ведь не будут
восстановлены в то же самое место в памяти,или я чегото не понимаю?)
Как быт?
Заранее благодарен!
А>А>class Vertex
А>{
А> public:
А> // .......
А> private:
А> //.......
А> std::vector<Vertex> * children;
А>};
А>
А>А затем сериализовать вектора и вершины;
А>Но когда я попробую считать(после неодной перезагрузки) я не смогу
А>восстановить структуру дерева т.к.
А>сохраненные указатели на детей уже
А>не будут таковыми(узлы ведь не будут
А>восстановлены в то же самое место в памяти,или я чегото не понимаю?)
Если наследовать все свои классы из CObject — то как раз восстановится структура дерева, указатели конечно по значению могут оказаться и другими, но указывать будут на "правильные" объекты.Об этом позаботится MFC.
Очень рекомендуемо почитать на RSDN статью "Сериализация в MFC".
http://rsdn.ru/article/?mfc/mfcseria.xmlАвтор(ы): Джим Биверидж
Дата: 17.04.2001
В статье очень подробно рассматривается механизм сериализации, реализованный в MFC. Автор
дает полную информацию о работе макросов DECLARE/IMPLEMENT_DYNAMIC, DECLARE/IMPLEMENT_SERIAL
и DECLARE/IMPLEMENT_DYNCREATE. Также обсуждается поддержка версий схем сериализации.
В двух словах — есть если у вас есть скажем 2 объекта, в которых например хранятся указатели друг на друга — то после сохранения и востановления они конечно могут и изменится, но все равно будут указывать друг на друга.
И еще — скажем так
CTestClass *pClass1;
CTestClass *pClass2=pClass1;
.....
archive << pClass1;
archive << pClass2;
— тут запишется всего одна копия объекта — ибо он допрет что указатели ссылаюися на одно и тожу,
и когда потом вы напишете
archive >> pClass1;
archive >> pClass2;
то восстановится тоже 1 оюъект, и оба указателя будут указывать на него.
Саша.
P.S. гдето я это уже писал

— попробуйте поиск.....
Саша.
Здравствуйте Hemmul, Вы писали:
H>archive >> pClass1;
H>archive >> pClass2;
H>то восстановится тоже 1 оюъект, и оба указателя будут указывать на него.
H>Саша.
H>P.S. гдето я это уже писал
— попробуйте поиск.....
Сорри, это был я — забыл брата вылогинить

))
Саша.