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

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

ru
Offline Offline
Пол: Мужской
Кот рыжий


« : 14-09-2005 06:30 » 

Никак не могу придумать как реализовать  Здесь была моя ладья...
Нужно сохранить структуру или класс типа

class DataToSave{
int a;
float b;
CString c;
};

С интом и флоатом все понятно, а вот как быть с CStringом? причем это должен быть обязательно CString а не char[...]
Нужно сохранять весь класс целиком поскольку структура класса мне неизвестна т. е. так делать нельзя

Savea();
Saveb();
Savec();

Как быть?
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
PooH
Глобальный модератор

ru
Offline Offline
Пол: Мужской
... и можно без хлеба!


« Ответ #1 : 14-09-2005 06:32 » 

а если что то типа дампа памяти в которой хранится экземпляр класса?
Записан

Удачного всем кодинга! -=x[PooH]x=-
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #2 : 14-09-2005 06:36 » 

Я об этом думал но нужен размер класса в памяти и sizeof здесь не подходит
Я слышал проблемма както решается с помощью сериализации, никто не в курсе?
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
Hooter
Опытный

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

« Ответ #3 : 14-09-2005 06:39 » 

при сохранении строки обычно делают что-то вроде этого: сохраняют сначала ее длину, а затем сохраняют всю строку.

при чтении из файла - обратная последовательность: читаешь длину строки, а затем читаешь указанное количество символов.
Записан
Hooter
Опытный

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

« Ответ #4 : 14-09-2005 06:40 » 

а что касается CString, то сначала читешь из файла строку, а затем создаешь класс (или просто присваиваешь) CString.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #5 : 14-09-2005 06:44 » 

CString str="текстттт";
char *p;
int len;

len=str.GetLength();
p=str.GetBuffer(len);

p - указатель на строку байт
len - длина (НЕ включая символ 0)
Записан

USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #6 : 14-09-2005 06:45 » 

а что касается CString, то сначала читешь из файла строку, а затем создаешь класс (или просто присваиваешь) CString.
Структура класса мне неизвестна Я не знаю есть ли там CString или нет а может там CRect?
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #7 : 14-09-2005 06:48 » 

а читать из файла так:
узнаём длину, создаём чар-массив, ДОПИСЫВАЕМ НОЛЬ(а то вылет обеспечен), читаем в него, а затем присваиваем стрингу:

CString str;

//здесь читаем длину
//...-> N

char *p=new char[N+1];
p[N]=0;

//здесь читаем из файла в p[]
//...

//присваиваем
str=p;
Записан

USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #8 : 14-09-2005 06:51 » 

Алексеееей))) Do you hear me?)
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
Hooter
Опытный

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

« Ответ #9 : 14-09-2005 06:52 » 

Я слышал проблемма както решается с помощью сериализации, никто не в курсе?

стандартный механизм сериализации (я говорю о MSVC 6.0, может в 7-ом и по-другому) для CString сохраняет только содержимое строки, то есть сам текст.
а читает - по отдельными  словами. то есть стандартные операции сериализации сохранения/чтения для CString не являются обратными к друг другу.

можно переопределить сериализацию для класса унаследованного от CString. но оно тебе надо?

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

Записан
Hooter
Опытный

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

« Ответ #10 : 14-09-2005 06:53 » 

а что касается CString, то сначала читешь из файла строку, а затем создаешь класс (или просто присваиваешь) CString.
Структура класса мне неизвестна Я не знаю есть ли там CString или нет а может там CRect?

А, извини. Тогда действительно можно унаследовать класс от CString  и переопределить Serialize.
Записан
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #11 : 14-09-2005 07:00 » 

Видишь ли я не знаю есть там CString или нет для меня этот класс как черный ящик
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #12 : 14-09-2005 07:07 » 

USBLexus  i hear Улыбаюсь

просто когда я писал твоего поста не было ещё.

Если класс - чёрный ящик, тогда - дрова. Никак ты его, если в него не встроено сохранение. С другой стороны - как в смысте ЧЯ ?

ты знаешь, какие именно свойства надо сохранить - ты их и сохрани, а при загрузке - создай экземпляр класса и залей в него эти свойства
Записан

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

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


« Ответ #13 : 14-09-2005 07:08 » 

если ты пишешь этот класс, ты ему встой методу

Сахраницца();
Записан

USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #14 : 14-09-2005 07:25 » 

ЧЯ в том смысле что я получаю класс на входе шаблонной функции и тип он следовательно может иметь любой Мне его нужносохранить на диск но вот проблема как это сделать... И пишу его не я
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
Hooter
Опытный

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

« Ответ #15 : 14-09-2005 07:32 » 

Для тебя какой класс как ЧЯ? DataToSave? или его член CString/CRect/CSomething...?

Если DataToSave, то его разработчик должен позаботиться о механизме сериализации...
А тебе достаточно будет вызвать Serialize.
« Последнее редактирование: 14-09-2005 07:34 от Hooter » Записан
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #16 : 14-09-2005 07:33 » 

Для тебя какой класс как ЧЯ? DataToSave? или его член CString/CRect/CSomething...?
DataToSave
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
Hooter
Опытный

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

« Ответ #17 : 14-09-2005 07:34 » 

Если DataToSave, то его разработчик должен позаботиться о механизме сериализации...
А тебе достаточно будет вызвать Serialize.
Записан
Hooter
Опытный

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

« Ответ #18 : 14-09-2005 07:37 » 

А что вообще тебе известно о DataToSave?
Записан
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #19 : 14-09-2005 07:38 » 

Если DataToSave, то его разработчик должен позаботиться о механизме сериализации...
А тебе достаточно будет вызвать Serialize.
Это както неудобно разрабатывать метод для каждого класса в принципе сейчас оно все так и реализовано). Хотелось бы автоматизировать процесс...
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #20 : 14-09-2005 07:39 » 

А что вообще тебе известно о DataToSave?
Что это класс))
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
Hooter
Опытный

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

« Ответ #21 : 14-09-2005 07:46 » 

А что вообще тебе известно о DataToSave?
Что это класс))

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

Или на вход шаблонной функции могут быть поданы только классы только определенного множества типов (например только CDataToSave, COtherDataToSave и CAnotherDataToSvae) ?

Хотя даже в этом случае тебе придется написать проседуру сохранения для каждого класса... Жаль
« Последнее редактирование: 14-09-2005 07:49 от Hooter » Записан
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #22 : 14-09-2005 08:48 » 

USBLexus,

у меня тут есть проект, в котором я гайки кручу Ага. Так вот тут все работает и с CString, но вот каким образом:

class MyClass : public CObject
{
  CString m_Str;
  LONG    m_n1;
....
}

Потом где-то там, где надо сохранять :

void какой_то класс::MyFunc()
{
   CFile*  myFile;

   myFile=new CFile(PathName,CFile::modeRead);

   CArchive ar(myFile,CArchive::load);
   Serialize(ar);

   ar.Close();
   myFile->Close();
   delete myFile;   
}

void какой_то класс::Serialize(CArchive& ar)
{
   MyClass * pObject;

   if(ar.IsStoring())
   {
      pObject = как-то его получаешь;
      ar << pObject;
   }
   else
   {
      // read file
      ar >> pObject;

      pObject->Set_всеПараметры(start_value);
   }
}

Но важно, чтобы класс был наследован от CObject, тогда это работает.
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Джон
просто
Администратор

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

« Ответ #23 : 14-09-2005 09:52 » 

В самом общем случае - когда о классе ничего не известно и он не "твой" - единственно правильное и чистое решение:
его разработчик должен позаботиться о механизме сериализации...
А тебе достаточно будет вызвать Serialize.

В крайнем случае обяжи разработчика сделать хотябы функцию GetSize(), тогда ты сможешь сохранять кусок памяти.

А иначе задача не имеет решения
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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."
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #24 : 14-09-2005 10:22 » 

Malaja,

Спасибо!
Классно, по виду вроде то что надо:)))))))))))))))))))))))
Попробую внедрить как разгребусь немножко %) Отпишу потом что получится!
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #25 : 14-09-2005 10:24 » 


В крайнем случае обяжи разработчика сделать хотябы функцию GetSize(), тогда ты сможешь сохранять кусок памяти.
А иначе задача не имеет решения


Думаю что я могу заставить разработчика класса унаследовать его от CObject Ага
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #26 : 14-09-2005 10:29 » 

USBLexus,

просто если класс гуляет как кошка, т.е. сам по себе, и о нем ничего вообще неизвестно, плюс у него нет никакой реализации для сериализации, то я даже понятия не имею, как это можно сохранить (Джон об этом уже написал).

Приведенный мной пример работает, т.к. проект живет уже долго и даже иногда счастливо Ага
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Джон
просто
Администратор

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

« Ответ #27 : 15-09-2005 07:30 » 

Думаю что я могу заставить разработчика класса унаследовать его от CObject Ага

Отличненько! Не забудь его так-же "заставить" Улыбаюсь использовать макросы DECLARE_SERIAL и IMPLEMENT_SERIAL. А то работать не будет.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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."
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #28 : 19-09-2005 09:27 » 

Написал тут тестовый проект... чтото я по моему не то  делаю...

Описал класс:
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
class StoredClass: public CObject
{
public:
   DECLARE_SERIAL(StoredClass)
   StoredClass(void);
   ~StoredClass(void);
   CString str;
   int      number;
   CRect   rect;
};

IMPLEMENT_SERIAL(StoredClass, CObject, 1)

StoredClass::StoredClass(void):CObject()
{
   str="Constructor";
   number=1;
   rect=CRect(1,1,1,1);
}

StoredClass::~StoredClass(void)
{
}
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
Написал функцию сохранения класса на диск

void CTestSaveDlg::OnBnClickedButton1()
{
   CFile*  myFile;

   myFile=new CFile("1.dat",CFile::modeCreate|CFile::modeWrite);

   CArchive ar(myFile,CArchive::store);
   Serialize(ar);

   ar.Close();
   myFile->Close();
   delete myFile;   
}

где

void CTestSaveDlg::Serialize(CArchive& ar)
{
   if(ar.IsStoring())
   {
      ar << &m_StoredClass;
   }
   else
   {
   StoredClass* pClass=&m_StoredClass;
    ar >> pClass;
   }
}

Сохраняется в файл чтото левое - "яя StoredClass"
Восстановить по вот этому класс невозможно.
Что я делаю нетак?
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #29 : 19-09-2005 09:32 » 

StoredClass   m_StoredClass;
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #30 : 19-09-2005 09:34 » 

Сохраняется в файл чтото левое - "яя StoredClass"

Отлично  "я - StoredClass"

ладно, шутю...
Записан

USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #31 : 19-09-2005 09:39 » 

 :)Ага
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #32 : 19-09-2005 09:40 » 

if(ar.IsStoring())
 {
ar << &m_StoredClass;
 }
 else
 {
   StoredClass* pClass=&m_StoredClass;
 ar >> pClass;
 }

может тут не указателями надо ворочать?
Записан

USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #33 : 19-09-2005 09:48 » 

Малая сказала что указателями да и в MSDN написано
friend CArchive& operator <<(
   CArchive& ar,
   const CObject* pOb
);
Этот оператор для указателя определен
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #34 : 19-09-2005 10:12 » 

Люди, пардон, я два дня не смотрела форум, посему не видела описания проблемы.
USBLexus,
у меня есть тестовый проект (там куча всякого мусора, но и это там тоже есть и работает) - если хочешь, я тебе его скину, посмотришь, как и что там сделано.   
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Джон
просто
Администратор

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

« Ответ #35 : 19-09-2005 10:26 » 

USBLexus, добавь в свой класс ф-ю:

virtual void Serialize(CArchive& ar);

void StoredClass::Serialize(CArchive& ar)
{
   if (ar.IsStoring())
   {
      ar << str;
      ar << number;
      ar << rect;

   }
   else
   {
      ar >> str;
      ar >> number;
      ar >> rect;
   }
}

Это ведь объекты - полиморфизм ты используешь

 if(ar.IsStoring())
 {
ar << &m_StoredClass;
 }
 else
 {
   StoredClass* pClass=&m_StoredClass;
 ar >> pClass;
 }

 но где определён сам механизм сохранения данных в архив? Именно этим и занимается виртуальная ф-я  Serialize. Вызов которой происходит после обращения к оператору >> у каждого объекта. Те проще говоря ты сказал "Сохрани", но не сказал как?

Альтернативно можно записать вместо

 if(ar.IsStoring())
 {
ar << &m_StoredClass;
 }
 else
 {
   StoredClass* pClass=&m_StoredClass;
 ar >> pClass;
 }

просто
m_StoredClass.Serialize(ar);

Учти, что при этом получится другой формат, тк в первом случае будет сохранена инфа о классе. Те надо пользоваться или всегда первым или всегда вторым способом.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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."
Hooter
Опытный

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

« Ответ #36 : 19-09-2005 11:05 » 

Тебе просто неоходимо определить Serialize для класса StoredClass. Иначе не будет сериализовываться. Тебе уже писали об этом с самого начала Ага

Кроме этого, я еще не уверен, но по-моему здесь ты пытаешься сохранить указатель на объект.
ar << &m_StoredClass;

Чтобы сохранить объект с помощью сериализации нужно определить для него метод Serialize и вызвать его.
После того как ты опишешь функцию Serialize для класса StoredClass, то код его сохранения/чтения будет выглядеть вот так:

void CTestSaveDlg::Serialize(CArchive& ar)
{
    m_StoredClass.Serialize  (ar);
}

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

Посмотри ссылки:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclib/html/_mfc_cobject.3a3a.serialize.asp
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore/html/_core_storing_and_loading_cobjects_via_an_archive.asp
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore/html/_core_using_the_carchive_.3c3c_.and_.3e3e_.operators.asp
« Последнее редактирование: 19-09-2005 11:17 от Hooter » Записан
Hooter
Опытный

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

« Ответ #37 : 19-09-2005 11:11 » 

Малая сказала что указателями да и в MSDN написано
friend CArchive& operator <<(
 CArchive& ar,
 const CObject* pOb
);
Этот оператор для указателя определен

Этот оператор определен для указателя на CObject, а не на твой класс.
Так как эта оперция не определена для твоего класса, то указатель на твой класс по умолчанию приводится к CObject.
А operator << (CObject *)  всего лишь сохраняет значение указателя (или размер - не помню уж) и имя класса. Отсюда ты в файле видишь: яяхх StoredClass.
Записан
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #38 : 20-09-2005 01:49 » 

Люди, пардон, я два дня не смотрела форум, посему не видела описания проблемы.
USBLexus,
у меня есть тестовый проект (там куча всякого мусора, но и это там тоже есть и работает) - если хочешь, я тебе его скину, посмотришь, как и что там сделано.   


Ага хочу, скинь плиииззз))
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #39 : 20-09-2005 01:50 » 

Джон, видишь ли структура класса мне неизвестна
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #40 : 20-09-2005 06:41 » 

USBLexus,

во-первых, извини, что не сделала вчера - ребенку стало хуже, чем было, пришлось бегом к врачу бежать. А дома у меня этого проекта нет.
 
Tеперь по существу - после старта щелкаешь на кнопке "Serialize", появляется диалог для внесения и последующего просмотра элементов. Основной класс - SerialTest, класс типа твоего неизвестного - SerialPerson.
Посмотри в конструкторе диалогового класса - там задан жесткий путь к файлу, подкорректируй его для себя.
Заранее прошу прощения - там код типа "сырец" Ага, т.е. я его не полировала на предмет проверок всех возможных патовых ситуаций, т.к. это мой тестовый проект, где я что-то пробую.
Если есть вопросы - спрашивай в форуме или кинь мне маил на работу (irina.tebelewa.ext@siemens.com)
Попалась - хотела зип подвесить к ответу, а меня послали грубо и не по-женски Ага
Посему извиняюсь перед всеми.
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Hooter
Опытный

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

« Ответ #41 : 20-09-2005 07:06 » 

Джон, видишь ли структура класса мне неизвестна
USBLexus, ты же сам сказал, что сможешь заставить разработчика класса унаследовать класс от CObject...
Речь идет о том, чтобы разработчик класса не только унаследовал класс от CObject, но и переопределил в этом классе метод Serialize.
Если ты собираешься использовать сериализацию и сам не можешь менять реализацию этого класса, то проблема решается только так.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #42 : 20-09-2005 07:40 » 

мне кажется, если в классе выделен блок памяти через new, то не зная указателя на эту память, сохранить и восстановить её нельзя
Записан

Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #43 : 20-09-2005 07:51 » 

Леш,

погоди - для работы с объектом (даже если не ты его запрограммировал) у тебя должен быть какой-то указатель на него, т.е. либо у тебя самого есть список объектов, либо тебе его кто-то создает и передает тебе указатель на него. Из чего следует, тебя интересует только его наличие (указателя то бишь) плюс, как было сказано раньше, наследование от CObject и реализация стандартного метода Serialize для того класса, объекты которого должны быть сохранены. Все.
Или ты что-то другое имеешь в виду?
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #44 : 20-09-2005 08:10 » 

другое.

USBLexus в идеале хочет взять чёрный ящик и сохранить его. Если в ящике есть переменная-указатель, указывающая на выделенную new область памяти (то есть, по сути, имеем данные ВНЕ ящика и только ящик об этом знает) то идеала не получится

а заставить разработчика Serialize() написать (его написать - это отдельная песня) - это , как бы сказать, не то, что хотелось USBLexus'у изначально

вот об этом я
« Последнее редактирование: 20-12-2007 18:00 от Алексей1153++ » Записан

USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #45 : 20-09-2005 08:23 » 

Malaja
Спасибо за исходники! Посмотрел, разобрался)

Да, видимо чудес не бывает((( Знание струткуры класса необходимо((( Мда сколько придется проделать "лишней" работы по написанию функции сохранения или переопределения сериализации для каждого класса Афигеть. А если структура поменяется опять переделывать функцию сохранения а можно и забыть и будут ошибки которые можно и не найти вовремя...
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #46 : 20-09-2005 08:38 » 

USBLexus,

Народ, стоп - работать с черным ящиком просто нереально! Иначе будет по классике "я у аптеки, а я в кино искала Вас "...

Т.е. каждый раз при изменении структуры надо брать разработчика за выступающие части тела и требовать продолжения банкета по правилам, т.е. теоретически в софте каждый должен сам отвечать за свой кусок кода. В данном случае это задача разработчика того самого класса - "черного ящика". Для тебай ничего не должно меняться, т.е. ты пишешь один раз свою функцию

   if(ar.IsStoring())
   {
      pObject = как-то его получаешь;
      ar << pObject;
   }
   else
   {
      // read file
      ar >> pObject;

      pObject->Set_всеПараметры(start_value);
   }

и привет.
В данном случае ты только используешь чей - то код.
Ну или тебе должен быть передан ишодный код того класса, тогда ты сам себе хозяин и тогда ты сам должен обо всем помнить Ага .
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #47 : 20-09-2005 08:42 » 

USBLexus , выход несложен - определи структуру в классе, где храни всё, что надо сохранять. В неё же встрой дополнительные функции для промежуточных всяких преобразований для сохранения / восстановления. Если что-то меняется - меняешь название встроенных функций или переменных (например приписываешь к имени функции "..._номер_версии_функции") и компилятор сам найдёт все места, на которые тебе нужно обратить внимание
Записан

Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #48 : 20-09-2005 08:55 » 

Леш,

для особо тупых - как это? Я не совсем поняла, извини.  Жаль
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #49 : 20-09-2005 09:09 » 

Алексей1153,

Да я тоже об этом думал, наверное так и придется сделать. Жаль
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #50 : 20-09-2005 09:29 » 

Ирина, ты вовсе не тупая, что за глупости! Улыбаюсь

просто эксплуатируем замечательное свойство языка C - переменная обязательно должна быть определена.

Если нам надо найти все связи с этой переменной - меняем её имя (к примеру с Var на Var_1) и смотрим везде, где используется.

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

Записан

Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #51 : 20-09-2005 09:57 » 

Леш,

муррр Ага
Т.е. ты хочешь сказать, что если до этого в классе были переменные и функции
м_имя, м_адрес, гетИмя, гетАдрес и т.д., то теперь это должно переехать в структуру и при каждом изменении менять имена в структуре? Или я опять мимо?
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #52 : 20-09-2005 10:02 » 

в принципе да - все свойства и методы над ними - в одном месте. Но менять ВСЁ каждый раз не надо. Надо переименовать только то, что меняешь ,или добавляешь. Если удаляешь - компилятор так же покажет, где зависимости были, так как переменной не стало.
А вообще - самое простое просто забить в поиск и найти все использования переменной. Но так легко запутаться.

а кроме того, отладив новую версию, имена можно вернуть на старые, если угодно. Но смысла думаю нет
Записан

Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #53 : 20-09-2005 10:42 » 

Леш,

спасибо, теперь все ясно.
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Страниц: 1 2 [Все]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines