|
Вопрос # 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)
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|