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

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

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

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


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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.03.2016, 22:00
Ответы с готовыми решениями:

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

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

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

Удаление динамически созданных объектов
Приветствую. Вопрос поднимался, но что то не получается! Создаю объекты в цикле PanMap = new...

8
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
10.03.2016, 22:51 2
Цитата Сообщение от Pseudodog Посмотреть сообщение
Я просто не понимаю что в таком случае будет с адресом и смогу ли я получить точно такой же адрес, прочитав из файла и грубо говоря сделать как и было до закрытия программы. Как это организовать?
Записывать адреса в файл - смысла нет. Нужно записывать содержимое по адресу.
0
52 / 52 / 24
Регистрация: 24.12.2011
Сообщений: 133
10.03.2016, 22:51 3
Нет, так делать нельзя. После того, как программа закрылась, адрес становится недействительным.
1
0 / 0 / 0
Регистрация: 18.11.2014
Сообщений: 18
10.03.2016, 23:18  [ТС] 4
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 5
Цитата Сообщение от Pseudodog Посмотреть сообщение
а что подразумевается под содержимым?
Тот объект, который находится по этому адресу (разыменование указателя).
1
52 / 52 / 24
Регистрация: 24.12.2011
Сообщений: 133
10.03.2016, 23:40 6
Лучший ответ Сообщение было отмечено Pseudodog как решение

Решение

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

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

1) выделили память под объект (new)
2) прочитали поля объекта из файла
1
0 / 0 / 0
Регистрация: 18.11.2014
Сообщений: 18
10.03.2016, 23:42  [ТС] 7
Juffin, ох =( спасибо, придётся повозиться. суть понял.
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
10.03.2016, 23:56 8
Цитата Сообщение от 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  [ТС] 9
nd2, крутяк, буду изучать. спасибо!
0
10.03.2016, 23:58
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.03.2016, 23:58
Помогаю со студенческими работами здесь

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

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

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

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

Сохранение данных из динамически созданных объектов в PageControl
Всем привет. Суть проблемы на форме разместил компонент PageControl , в нём динамически создаю...

Обработка событий динамически созданных объектов в С++ Builder
Добрый день! Подскажите, пожалуйста, возможное решение следующей проблемы... Есть некая форма. На...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru