С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
0 / 0 / 0
Регистрация: 18.11.2014
Сообщений: 18

Запись динамически созданных объектов в файл

10.03.2016, 22:00. Показов 1373. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет. Хочу спросить, пока не наделал глупостей. Есть два класса.


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
//первый класс, родитель
 
class someObj
 
{
 
 //опустим конструкторы, все дела. в нём есть массив указателей на такой же класс некоего размера
 someObj *someArray[size];
 
} obj;
 
//второй класс, чадушко
 
class childObj: public someObj
 
{
 
 someObj *create();
 
} chiObj;
 
//собственно одна из причин затыка, метод класса, который мне очень нужен
 
someObj *childObj::create()
 
{
 
 return new childObj;
 
}
 
//в определённый момент происходит следующее
 
obj.someArray[0] = chiObj.create(); //т.е. я выделяю память и такой нехитрой конструкцией в массив пихаю динамически созданный объект
 
//ну и когда-нибудь
 
delete obj.someArray[0]; //освобождаю память и грохаю более мне не нужный объект
Так вот между тем как создать и грохнуть объект мне нужно записать некоторые вещи в файл. Как записать строки, числа и т.д., всё ясно. Но я ж тут память выделяю. Вопрос в том, могу ли я записать в память содержимое массива someObj *someArray[size]; в который я ранее запихал объект, созданный в функции someObj *childObj::create(); в которой память выделялась. Я просто не понимаю что в таком случае будет с адресом и смогу ли я получить точно такой же адрес, прочитав из файла и грубо говоря сделать как и было до закрытия программы. Как это организовать? Про чтение/запись много инфы, но чёт про это не найду. Если это не возможно, то пока не наворотил, буду переделывать. Хотя мне почему-то кажется, что выход есть.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.03.2016, 22:00
Ответы с готовыми решениями:

Освобождение памяти динамически созданных объектов
Подскажите, есть к примеру три класса: Class1, Class2, Class3. В Class2 имеется метод, в котором динамически создаю объекты класса...

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

События динамически созданных объектов
Доброго всем времени суток! Суть вопроса такова: я динамически в пользовательском классе создаю объект класса TTimer. Мне необходимо...

8
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
10.03.2016, 22:51
Цитата Сообщение от Pseudodog Посмотреть сообщение
Я просто не понимаю что в таком случае будет с адресом и смогу ли я получить точно такой же адрес, прочитав из файла и грубо говоря сделать как и было до закрытия программы. Как это организовать?
Записывать адреса в файл - смысла нет. Нужно записывать содержимое по адресу.
0
52 / 52 / 24
Регистрация: 24.12.2011
Сообщений: 133
10.03.2016, 22:51
Нет, так делать нельзя. После того, как программа закрылась, адрес становится недействительным.
1
0 / 0 / 0
Регистрация: 18.11.2014
Сообщений: 18
10.03.2016, 23:18  [ТС]
Juffin, логично, так и думал в общем-то. спасибо.

nd2, а что подразумевается под содержимым? В массиве someObj *someArray[0]; в моём случае записан экземпляр класса chiObj. Получится, я запишу всё его содержимое в файл? Допустим я так сделал (если правильно понял). Когда я вставлю строку кода с чтением из файла, то я получается просто пихну в этот же массив его содержимое? И программа не обидится, что ранее под это дело при помощи new память выделялась?

Ну что б более предметно:

C++
1
2
3
4
5
obj.someArray[0] = chiObj.create();
 
write();
 
exit();
Программа закрылась. И на следующий запуск пишу:

obj.someArray[0] = read(); //ну совсем условно
//это норм будет?
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
10.03.2016, 23:24
Цитата Сообщение от Pseudodog Посмотреть сообщение
а что подразумевается под содержимым?
Тот объект, который находится по этому адресу (разыменование указателя).
1
52 / 52 / 24
Регистрация: 24.12.2011
Сообщений: 133
10.03.2016, 23:40
Лучший ответ Сообщение было отмечено Pseudodog как решение

Решение

Pseudodog, метод примерно такой:
1) выделили память под объект (new)
2) что-то там с ним сделали, заполнили поля
3) записали в файл
4) освободили память (delete)

Программа закрылась, потом открылась заново.

1) выделили память под объект (new)
2) прочитали поля объекта из файла
1
0 / 0 / 0
Регистрация: 18.11.2014
Сообщений: 18
10.03.2016, 23:42  [ТС]
Juffin, ох =( спасибо, придётся повозиться. суть понял.
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
10.03.2016, 23:56
Цитата Сообщение от Pseudodog Посмотреть сообщение
Ну что б более предметно:
Чтобы более предметно, вариант с полиморфизмом:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
const size_t size = 3;
 
class someObj
{
public:
 //опустим конструкторы, все дела. в нём есть массив указателей на такой же класс некоего размера
 someObj *someArray[size];
 virtual void write_file(std::ofstream& fout)
 {
 }
 
 virtual void read_file(std::ifstream& fin)
 {
 }
 
 virtual ~someObj()
 {
    
 }
} obj;
 
//второй класс, чадушко
 
class childObj: public someObj
{
    int x;
public:
    childObj(int a) : x(a)
    {}
 
    //собственно одна из причин затыка, метод класса, который мне очень нужен
    someObj *create(int a)
    { return new childObj(a); }
 
    virtual void write_file(std::ofstream& fout)
    {
        fout << x << '\n';
    }
 
    virtual void read_file(std::ifstream& fin)
    {
        fin >> x;
    }
 
    virtual ~childObj()
    {
    }
 
} chiObj(0);
 
 
int main(/*int argc, char **argv*/)
{
    //в определённый момент происходит следующее
    for (int i = 0; i < size; ++i)
        obj.someArray[i] = chiObj.create(i + 1); //т.е. я выделяю память и такой нехитрой конструкцией в массив пихаю динамически созданный объект
    
    std::ofstream fout("objects.txt");
    for (int i = 0; i < size; ++i)
        obj.someArray[i] ->write_file(fout);
    fout.close();
 
     //ну и когда-нибудь
    for (int i = 0; i < size; ++i)
        delete obj.someArray[i]; //освобождаю память и грохаю более мне не нужный объект
    
    someObj obj2;
    for (int i = 0; i < size; ++i)
        obj2.someArray[i] = chiObj.create(0);
 
    std::ifstream fin("objects.txt");
    for (int i = 0; i < size; ++i)
        obj2.someArray[i] ->read_file(fin);
    fin.close();
 
     //ну и когда-нибудь
    for (int i = 0; i < size; ++i)
        delete obj2.someArray[i]; //освобождаю память и грохаю более мне не нужный объект
 
    std::system("pause");
}
1
0 / 0 / 0
Регистрация: 18.11.2014
Сообщений: 18
10.03.2016, 23:58  [ТС]
nd2, крутяк, буду изучать. спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.03.2016, 23:58
Помогаю со студенческими работами здесь

Удаление динамически созданных объектов
Приветствую. Вопрос поднимался, но что то не получается! Создаю объекты в цикле PanMap = new TPanel(Panel1); PanMap-&gt;Tag = TagMap;...

Удаление динамически созданных объектов
Здравствуйте. Не могу понять, как можно удалять динамически созданные объекты при смене вкладки в TPageControl Добавлено через 3 часа...

Удаление динамически созданных объектов
добрый день. чувствую себя полным нубом)) столкнулся с проблемой: на динамически созданной форме необходимо удалить динамически созданную...

Удаление динамически созданных объектов
Помогите плз. Пишу курсач по МИО. Вот ща работаю над интерфейсом. Я по нажатию кнопку создаю динамически объект edit. Хочу теперь при...

События динамически созданных объектов
Всем привет :) Вопрос в том, как сделать отдельные события для каждой динамически созданной кнопки ? Пока получилось только для всех...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru