| 
| 
 | Вопрос # 3 696/ вопрос решён / | 
 |  Здравствуйте, уважаемые эксперты!
 У меня есть класс:
 
 class TMemoryBlock
 {
  public:
   unsigned int StartAddr;
   unsigned int Size;
   unsigned int *Data;
   //
   //TMemoryBlock();
   //~TMemoryBlock();
   //
   void InitData(unsigned int initValue);
   void SaveDataToFile(AnsiString fName, AnsiString blockName);
   void LoadDataFromFile(AnsiString fName, AnsiString blockName);
 };Я создаю объекты класса:
 TMemoryBlock *block1;
.
.
.
TMemoryBlock *block100;Но возникает проблема, когда хоу записать или считать из файла все объекты. Приходится писать 100 строк кода block1->SaveDataToFile.
 ...
 block100->SaveDataToFile.
 Можно ли как-то автоматизировать операции со всеми объектами? Или надо создать массив объектов? Но заранее не известно сколько блоков мне понадобится.
 
 Заранее спасибо
 
|  |   Вопрос задал: Muratov Radik (статус: Посетитель)Вопрос отправлен: 27 января 2010, 08:52
 Состояние вопроса: решён, ответов: 2.
 |  Ответ #1. Отвечает эксперт: min@y™ Судя по типу AnsiString, это С++Builder.Тогда советую воспользоваться списком указателей TList (classes.hpp) или TObjectList (Contnrs.hpp). Тогда к элементам списка будет удобно обращаться по индексу в цикле и будет всегда известно их количество.
 Можно будет даже написать потомка от этих классов с методами SaveToFile(AnsiString FileName) и LoadFromFile(AnsiString FileName). Я бы так и сделал.
 
|  | Ответ отправил: min@y™ (статус: Доктор наук)Время отправки: 27 января 2010, 09:06
 Оценка за ответ: 5
 Комментарий к оценке: А можно поподробнее? я в ООП почти ноль |  Ответ #2. Отвечает эксперт: Вадим К Здравствуйте, Muratov Radik!код TMemoryBlock *block100;
 это не создание объекта. это лишь указатель на него. использовать сразу его нельзя. Должен быть вызов new.
 
 Оптимальным в данном случае будет использование вектора.
 при чем, можно создать вектор указателей, а можно и вектор объектов. Попробуем с указателями.
 #include
 
 stl::vector blocks;
 
 теперь загрузка будет выглядеть так
 for (int i = 0; i < blocks.size(); i++)
 blocks[i]->LoadDataFromFile(параметры);
 
 также теперь легко добавлять новые, удалять старые. рекомендую почитать это
 http://www.firststeps.ru/mfc/stl/
 http://www.cplusplus.com/reference/stl/vector/
 
|  | Ответ отправил: Вадим К (статус: Академик)Время отправки: 27 января 2010, 11:02
 Оценка за ответ: 5
 |  
 Мини-форум вопросаВсего сообщений: 2; последнее сообщение — 27 января 2010, 11:04; участников в обсуждении: 2. 
|   | Егор (статус: 10-ый класс), 27 января 2010, 08:58 [#1]:автоматизировать можно - через массив. 
 насчёт массива необходимой длины - оператор new [] никто не отменял, да и библиотека stl с её vector'ом тоже работает хорошо.
 Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.— Donald E. Knuth.
 |  
|   | Вадим К (статус: Академик), 27 января 2010, 11:04 [#2]:В целом, очень рекомендую поизучать stl - потом окупиться многократно. Галочка "подтверждения прочтения" - вселенское зло. |  31 января 2011, 19:36: Статус вопроса изменён на решённый (изменил модератор Ерёмин А.А.): Автоматическая обработка (2 и более ответов с оценкой 5) Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |