Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: сериализация для нескольких классов  (Прочитано 10291 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« : 13-09-2003 11:58 » 

сначала о проблеме и как я её обошёл (но мне не нравится как)
       
имеется три класса


class D : public CDocument
{
       int D_data;
       V *pV;
       P *pP;
};

class V : public CFormView
{
       int V_data;
       P plotter;
};

class P
{
       int P_data;
};


соответственно при serialize вызывается
void D::Serialize(CArchive& ar){}

мне нужно сохранять данные всех классов V и P.

 :arrow: сначала я сделал так
(data - это условно все переменные класса для сохранения,
pV,pP - заполненные указатели на объекты соотв. классов):

void D::Serialize(CArchive& ar)
{
       if (ar.IsStoring())
       {
              ar<<D_data;
              pV->Ser(ar);
              pP->Ser(ar);
              }
              else
   .....
}


в функциях Ser классов P иV тоже было своё ar<<X_data. Но в V это работало, а в P прога ломалась именно на ar<<.

 :arrow: тогда я сделал так: ВСЕ переменные для сохранения класса P создаются в D , а доступ - по указателям

class D : public CDocument
{
       friend class P;
       int D_data;
       int P_data;
       V *pV;
       P *pP;
};

class V : public CFormView
{
       int V_data;
       P plotter;
};

class P
{
       int *pP_data;
};

void D::Serialize(CArchive& ar)
{
       if (ar.IsStoring())
       {
              ar<<D_data;
                     ar<<P_data;
                     pV->Ser(ar);
       }
       else
       .....
}


 :arrow: но мне это не нравится, кроме того неудобно работать с указателями в классе P.

:?: подскажите, как лучше сделать
Записан

Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #1 : 13-09-2003 14:22 » 

Привет,

про статейку посмотри тут
http://www.planetaquarium.com/library/ckazki_o_g1256.html
или в Яндексе - "Борис Гребенщиков Сказки о Германии"

Про сериализацию - я её как-то не доверяю, поэтому никогда не использовал.
Сам писал данные в файл. Ubi nil vales, ibi nil velis

А так...

Согласно Doc/View архитектуре CView автоматически получает указатель на документ, поэтому обратно (CDocument получает указатель на CView) не очень хорошо. Ведь одни и те-же данные могут иметь несколько View. Поэтому я запихиваю данные в CDocument. А в View в OnPaint или в OnDrаw вызываю
GetDocument()->MyOnDraw(). Таким образом все данные сидят в СDocument и их можно сериаллизировать.

Ещё можно оператор << и  >> перегрузить для твоих объектов.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #2 : 13-09-2003 15:33 » 

ох уж этот БГ... Отлично  Супер.

 :arrow: Ubi nil vales, ibi nil velis  -  это опять ругаешься? Ага
 :arrow: расскажи, как
Цитата

Сам писал данные в файл.


я бы сам сразу так сделал, но не знаю как :?

 :arrow:
Цитата

Согласно Doc/View архитектуре CView автоматически получает указатель на документ, поэтому обратно (CDocument получает указатель на CView) не очень хорошо. Ведь одни и те-же данные могут иметь несколько View.


да, но я не пользовал GetNextView, я делал проще - заполнял указатели в конструкторах

 :arrow:
Цитата

<< и >> перегрузить для твоих объектов.


- а смысл? дело в том, что переданная ссылка на ar обламывает любое действие с ней в классе P
Записан

Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #3 : 15-09-2003 09:28 » 

Привет, опять я

В общем так:

Ubi nil vales, ibi nil velis - типа "где нифига не понимаешь, туда не суйся" (вольный превод)

Не понял - ты не знаешь как в файл писать? или где это сделать?

Я делаю так (все имена функций и тд даны мнемонически):

Например для списка объектов в CDocument создаю список указателей (STL, но можно и CObjList
если это MFCшные дети от CObject). "Рабочий" класс (в твоем случае CPlotter) делаю полиморфным
(обычно объекты немного отличаются друг от друга). Он получает виртуальные функции DrawMyObject(CDC *pDC),  GetDataToSaveToFile() (return value for example CString - если это текстовые данные) и InitObject().

СView-шная OnPaint, OnUpdate, OnInitialUpdate или OnDraw выглядит след образом:

CPaintDC dc(this);
GetDocument()->DrawAllObjects(&dc);


void CDocument::DrawAllObjects(CDC *pDC)
{
   // типа
   // бежишь по всему списку и зовёшь DrawMyObject(pDC);

}
При изменении данных в CObject вызывается UpdateAllViews()

Запись-чтение - переписываю OnNEwDocument OnOpenDocument OnSaveDocument

Определяю собственный формат данных (правила какие данные и как должны быть записаны)

Дальше по схеме как для Draw -> Открываю, читаю инициаллизирую. Изменяю, сохраняю

Всё в CDocument. Представь себе ситуацию, когда твои данные должны быть в разных видах представленны.
Поэтому я стараюсь держать данные и вид как можно дальше друг от друга. Как говорится: "Кесарю кесарево,
а слесарю слесарево"

А погодка у нас наладилась на выходные - бабье лето. Зашибись!!!
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #4 : 15-09-2003 16:43 » 

привет, Джон ! Что-то не слышно тебя в субботу и воскресенье.

 :arrow: да, слесарево сечение, - где-то я это уже слышал...

 :arrow: Извини, щас нет времени, как врублюсь - напишу (бегло просмотрел - не совсем понял) :?

Сейчас мне на работе срочно надо спроектировать клаву с индикацией для MAX38 - сижу, развожу печатную плату, затем прогу для атмела. Пробовал делать печатные платы методом "утюг"? Ага

 :arrow:
погода - дрянь, и не предвидится.
я б на неё бы мог обидиться,
но только надо ль?-нет не стОит.
Ведь после осени с зимою
опять наладиться тепло,
программный код к нам возвратится
мы будем снова вместе биться,
мы будем баги выцеплять,
и громко матом их лабать.
а, впрочем почему весною?
мы также осенью с зимою. Отлично
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #5 : 16-09-2003 19:15 » 

Джон, HI  :!:

 :arrow: STL -  :?:

 :arrow: полиморфным -  :?:
Записан

Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #6 : 17-09-2003 07:25 » 

STL - Standard Template Library.

"Полиморфным" опять проблеммы с языком. Ну это когда я (или ты) делаю родительский класс с чисто виртуальными функциями, которые определяются в детях. По моему это называется полиморфизмом - я вообщето ООП не по книжкам учил.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines