Как хранить дерево?
От: Аноним  
Дата: 09.04.02 16:48
Оценка:
Подскажите пожалуйста ,есть ли возможность средствами MFC
хранить данные в файле в виде дерева.
Причем предполагаетса возможность добавления новых вершин.
Re: Как хранить дерево?
От: Sasparella США  
Дата: 09.04.02 18:18
Оценка:
Здравствуйте Аноним, Вы писали:

А>Подскажите пожалуйста ,есть ли возможность средствами MFC

А>хранить данные в файле в виде дерева.
А>Причем предполагаетса возможность добавления новых вершин.

В смысле сериалтзовать древовидную структуру?

Можно.

Например так- если узел дерева это объект , содержаший в себе массив указателей на потомки,
то достаточно определить функцию сериализации этого массива , после чего сериалтзоввывать себя и затем детей. Что в свою очередь сериализуеи дейтей и их детей и так далее.

Таим образом запись дерева будет такой


archive << pBaseObject;


Чтение — аналогично.


Будут вопросы — поделюсь конкретными классами и подводными камушками.


Саша.
Re[2]: Как хранить дерево?
От: Аноним  
Дата: 10.04.02 16:58
Оценка:
Здравствуйте Sasparella, Вы писали:

S>Здравствуйте Аноним, Вы писали:


А>>Подскажите пожалуйста ,есть ли возможность средствами MFC

А>>хранить данные в файле в виде дерева.
А>>Причем предполагаетса возможность добавления новых вершин.

S>В смысле сериалтзовать древовидную структуру?


S>Можно.


S>Например так- если узел дерева это объект , содержаший в себе массив указателей на потомки,

S>то достаточно определить функцию сериализации этого массива , после чего сериалтзоввывать себя и затем детей. Что в свою очередь сериализуеи дейтей и их детей и так далее.

S>Таим образом запись дерева будет такой



S>
S>archive << pBaseObject;
S>


S>Чтение — аналогично.



S>Будут вопросы — поделюсь конкретными классами и подводными камушками.



S>Саша.


Спасибо. Это все конечно очень хорошо.
Но записать мне надо для того,чтобы через одну-две недели восстановить это
самое дерево.
Если записать как ты предлагаешь(если я тебя правильно понял)

class Vertex
{
  public:
  // .......
  private:
  //....... 
  std::vector<Vertex> * children;
};

А затем сериализовать вектора и вершины;
Но когда я попробую считать(после неодной перезагрузки) я не смогу
восстановить структуру дерева т.к.
сохраненные указатели на детей уже
не будут таковыми(узлы ведь не будут
восстановлены в то же самое место в памяти,или я чегото не понимаю?)
Как быт?
Заранее благодарен!
Re[3]: Как хранить дерево?
От: Hemmul США  
Дата: 10.04.02 17:26
Оценка:
А>
А>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. гдето я это уже писал — попробуйте поиск.....

Саша.

vox clamantis in deserto
Re[4]: Как хранить дерево?
От: Sasparella США  
Дата: 10.04.02 17:32
Оценка:
Здравствуйте Hemmul, Вы писали:


H>archive >> pClass1;

H>archive >> pClass2;

H>то восстановится тоже 1 оюъект, и оба указателя будут указывать на него.




H>Саша.


H>P.S. гдето я это уже писал — попробуйте поиск.....



Сорри, это был я — забыл брата вылогинить ))


Саша.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.