Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 3 696

Раздел: C++
/ вопрос решён /

Здравствуйте, уважаемые эксперты!

У меня есть класс:

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 Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: 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)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:29
Выполнено за 0.02 сек.