Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
 Аватар для Джон Кофи
266 / 81 / 18
Регистрация: 05.04.2018
Сообщений: 1,102
Записей в блоге: 1

Динамическое выделение памяти для массива классов

19.04.2018, 09:52. Показов 1825. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет. В строках 84 - 98 пытаюсь выделить динамически память для свича. После выполнения кейса 'n', размер массива увеличивается на 1, вроде все должно быть ок, но вылетает ошибка. Как только уже не пробовал, не получается.
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
#include <iostream>
#include <cstdlib>
#include <string>
using namespace std;
 
class Worker
{
private:
    int id;
    string sm;
    string name;
    string patronymic;
    string post;
    int hours;
    double payhour;
    double salary;
 
public:
    Worker()
    {
        id = hours = payhour = salary = 0;
    }
    
    Worker(int id, string sm, string name, string patronymic, string post, int hours, double payhour, double salary)
    {
        this->id = id;
        this->sm = sm;
        this->name = name;
        this->patronymic = patronymic;
        this->post = post;
        this->hours = hours;
        this->payhour = payhour;
        this->salary = salary;
    }
    
    void SetInfo();
    void GetInfo();
    void ListFunc();
};
 
int main()
{
    setlocale(LC_ALL, "ru");
    
    char action;
    int size = 1;
    Worker *arr2;
    Worker obj;
    
    Worker *arr = new Worker[size];
    
    do
    {       
        cout << "Choose action\n";
        obj.ListFunc();
        cout << ": ";
        cin >> action;
        
        switch(action)
        {
            case 'n':
            {
                for(int i = (size - 1); i < size; i++)
                {
                    arr[i].SetInfo();   
                }
                size++;
                break;
            }
            case 'v':
            {
                cout << "\n\nWorker data\n" << endl;
                cout << "ID  Surname\tName\tPatronymic\tPost\th/pay\tHours\tSalary\n";
                cout << "--------------------------------------------------------------------------\n";
                
                for(int i = 0; i < (size - 1); i++)
                {
                    arr[i].GetInfo();
                }
                break;
            }
        }
        
        arr2 = new Worker[size];
        
        for(int i = 0; i < size; i++)
        {
            arr2[i] = arr[i];
        }
        delete[]arr;
        
        arr = new Worker[size];
        
        for(int i = 0; i < size; i++)
        {
            arr[i] = arr2[i];
        }
        delete[]arr2;
        
        cout << endl << endl;
        
    }while(action != 'q');
    
    system("pause");
    return 0;
}
 
void Worker::SetInfo()
{
    cout << "\nEnter data \nID: ";
    cin >> id;
    cin.ignore();
    cout << "Surname: ";
    getline(cin, sm);
    cout << "Name: ";
    getline(cin, name);
    cout << "Patronymic: ";
    getline(cin, patronymic);
    cout << "Post: ";
    getline(cin, post);
    cout << "Number of hours: ";
    cin >> hours;
    cout << "Cost 1 hour: ";
    cin >> payhour;
    salary = hours * payhour;
}
 
void Worker::ListFunc()
{
    cout << "N - New worker" << endl;
    cout << "E - Edit data" << endl;
    cout << "F - Find worker" << endl;
    cout << "D - Delete data" << endl;
    cout << "S - Save to file" << endl;
    cout << "L - Load from file" << endl;
    cout << "V - Show all workers" << endl;
    cout << "C - Cort data" << endl;
    cout << "Q - Quit" << endl;
}
 
void Worker::GetInfo()
{
    cout << id << "  " << sm << "\t" << name << "\t " << patronymic << "\t" << post << "\t  " << payhour << "\t " << hours << "\t" << salary;
    cout << endl << endl;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.04.2018, 09:52
Ответы с готовыми решениями:

Динамическое выделение памяти для массива
Не могу разобраться, почему программа вызывает точку остановы после выбора действия в функции, причем не показывает, где. Она происходит...

Динамическое выделение памяти для массива
Кто может помочь решить задачу. Для заданного двумерного массива из n строк и m столбцов вывести на экран следующее меню операций: ...

Динамическое выделение памяти для элементов массива
Нужно разделить программу на функции ( не могу толком понять как это сделать) и выполнить следующие требования: 1. Первая функция не...

8
 Аватар для Avaddon74
571 / 353 / 133
Регистрация: 15.09.2017
Сообщений: 1,239
19.04.2018, 13:20
Джон Кофи, 88 и 96 строчки, что ты этим хотел сказать? У тебя в классе не реализован оператор присваивания, используй копирование блока памяти, так:
C++
1
memcpy(&arr2[i], &arr[i], sizeof(arr[i]));
0
 Аватар для Джон Кофи
266 / 81 / 18
Регистрация: 05.04.2018
Сообщений: 1,102
Записей в блоге: 1
19.04.2018, 13:44  [ТС]
Цитата Сообщение от Avaddon74 Посмотреть сообщение
У тебя в классе не реализован оператор присваивания, используй копирование блока памяти, так:
Avaddon74,
я понял что написал лишнее 84 - 98.
получилось с памятью сделать все вот как:
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
        Worker *arr;
    Worker obj;
 
    do
    {
        arr = new Worker[size];
        
        cout << "Choose action\n";
        obj.ListFunc();
        cout << ": ";
        cin >> action;
        
        switch(action)
        {
            case 'n':
            {
                for(int i = (size - 1); i < size; i++)
                {
                    arr[i].SetInfo();   
                }
                size++;
                break;
            }
            case 'v':
            {
                cout << "\n\nWorker data\n" << endl;
                cout << "ID  Surname\tName\tPatronymic\tPost\th/pay\tHours\tSalary\n";
                cout << "--------------------------------------------------------------------------\n";
                
                for(int i = 0; i < (size - 1); i++)
                {
                    arr[i].GetInfo();
                }
                break;
            }
        }
        
        cout << endl << endl;
        
    }while(action != 'q');
    
    delete[]arr;
Только вот геттер ничего не выводит, значения не присваиваются.
Миниатюры
Динамическое выделение памяти для массива классов  
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
19.04.2018, 13:45
У вас в цикле копируются значения указателей, а не объектов. Примитивное решение - явно создавать объект.
C++
1
arr2[i] = Worker(arr[i]);
А лучше использовать вектор.
0
 Аватар для Джон Кофи
266 / 81 / 18
Регистрация: 05.04.2018
Сообщений: 1,102
Записей в блоге: 1
19.04.2018, 13:52  [ТС]
Цитата Сообщение от MrGluck Посмотреть сообщение
А лучше использовать вектор.
я знаю, но пока не изучал, хочу без использования вектора сделать.
Я полностью переделал выделение памяти, понял, что присваивание значений во второй массив мне не нужно. Сделал указатель arr до блока switch, внутри блока выделение памяти, а уже после него delete[]arr. Больше ошибок памяти я не получаю и компилятор не ругается. Только функция Get() в блоке switch ('v') не выводит значения, показывает нули.
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
#include <iostream>
#include <cstdlib>
#include <string>
using namespace std;
 
class Worker
{
private:
    int id;
    string sm;
    string name;
    string patronymic;
    string post;
    int hours;
    double payhour;
    double salary;
 
public:
    Worker()
    {
        id = hours = payhour = salary = 0;
    }
    
    Worker(int id, string sm, string name, string patronymic, string post, int hours, double payhour, double salary)
    {
        this->id = id;
        this->sm = sm;
        this->name = name;
        this->patronymic = patronymic;
        this->post = post;
        this->hours = hours;
        this->payhour = payhour;
        this->salary = salary;
    }
    
    void SetInfo();
    void GetInfo();
    void ListFunc();
};
 
int main()
{
    setlocale(LC_ALL, "ru");
    
    char action;
    int size = 1;
    Worker *arr;    // для копирования массива;
    Worker obj;
 
    do
    {
        arr = new Worker[size];
        
        cout << "Choose action\n";
        obj.ListFunc();
        cout << ": ";
        cin >> action;
        
        switch(action)
        {
            case 'n':
            {
                for(int i = (size - 1); i < size; i++)
                {
                    arr[i].SetInfo();   
                }
                size++;
                break;
            }
            case 'v':
            {
                cout << "\n\nWorker data\n" << endl;
                cout << "ID  Surname\tName\tPatronymic\tPost\th/pay\tHours\tSalary\n";
                cout << "--------------------------------------------------------------------------\n";
                
                for(int i = 0; i < (size - 1); i++)
                {
                    arr[i].GetInfo();
                }
                break;
            }
        }
        
        cout << endl << endl;
        
    }while(action != 'q');
    
    delete[]arr;
    
    system("pause");
    return 0;
}
 
void Worker::SetInfo()
{
    cout << "\nEnter data \nID: ";
    cin >> id;
    cin.ignore();
    cout << "Surname: ";
    getline(cin, sm);
    cout << "Name: ";
    getline(cin, name);
    cout << "Patronymic: ";
    getline(cin, patronymic);
    cout << "Post: ";
    getline(cin, post);
    cout << "Number of hours: ";
    cin >> hours;
    cout << "Cost 1 hour: ";
    cin >> payhour;
    salary = hours * payhour;
}
 
void Worker::ListFunc()
{
    cout << "N - New worker" << endl;
    cout << "E - Edit data" << endl;
    cout << "F - Find worker" << endl;
    cout << "D - Delete data" << endl;
    cout << "S - Save to file" << endl;
    cout << "L - Load from file" << endl;
    cout << "V - Show all workers" << endl;
    cout << "C - Cort data" << endl;
    cout << "Q - Quit" << endl;
}
 
void Worker::GetInfo()
{
    cout << id << "  " << sm << "\t" << name << "\t " << patronymic << "\t" << post << "\t  " << payhour << "\t " << hours << "\t" << salary;
    cout << endl << endl;
}
Самое интересное, что без ООП у меня все классно получается, с классами же тормоза
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
19.04.2018, 14:36
У вас циклично выделяется память и записывается в один и тот же указатель. Уже на второй итерации вы теряете возможность освободить ранее выделенную память т.к. затираете информацию о ней.
На каждый new[] должен быть свой delete[].

Добавлено через 1 минуту
C++
1
2
3
4
for(int i = (size - 1); i < size; i++)
{
    arr[i].SetInfo();   
}
это благополучно заменяется на arr[size - 1].SetInfo();

Добавлено через 56 секунд
Цитата Сообщение от Джон Кофи Посмотреть сообщение
C++
1
2
3
4
for(int i = 0; i < (size - 1); i++)
{
    arr[i].GetInfo();
}
надо бы for(int i = 0; i < size; i++) иначе вы последний добавленный элемент не увидите.
0
 Аватар для Джон Кофи
266 / 81 / 18
Регистрация: 05.04.2018
Сообщений: 1,102
Записей в блоге: 1
19.04.2018, 14:43  [ТС]
MrGluck, точно, значит все-таки мне нужен второй массив для копирования. Спасибо!

Добавлено через 6 минут
Цитата Сообщение от MrGluck Посмотреть сообщение
надо бы for(int i = 0; i < size; i++) иначе вы последний добавленный элемент не увидите.
просто изначально size = 1; Каждый раз получается, что он выводит на 1 элемент больше, чем я вводил.
Цитата Сообщение от MrGluck Посмотреть сообщение
это благополучно заменяется на arr[size - 1].SetInfo();
Вот это красиво получается, спасибо)
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
19.04.2018, 15:33
Цитата Сообщение от Джон Кофи Посмотреть сообщение
Каждый раз получается, что он выводит на 1 элемент больше, чем я вводил.
На всякий случай уточню основные моменты:
При size = 1 цикл выполнится 1 раз.
При size = 2 - 2 раза и т.д.
Первый элемент имеет индекс 0, последний size - 1.
Элемента с индексом size нет.
0
 Аватар для Джон Кофи
266 / 81 / 18
Регистрация: 05.04.2018
Сообщений: 1,102
Записей в блоге: 1
19.04.2018, 15:39  [ТС]
Avaddon74, не получается. Не знаю как еще пробовать..
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
char action;
    int size = 1;
    Worker obj;
    
    Worker *arr = new Worker[size];
    
    do
    {   
        cout << "Choose action\n";
        obj.ListFunc();
        cout << ": ";
        cin >> action;
        
        switch(action)
        {
            case 'n':
            {
                arr[size - 1].SetInfo();   
                size++;
                
                break;
            }
            case 'v':
            {
                cout << "\n\nWorker data\n" << endl;
                cout << "ID  Surname\tName\tPatronymic\tPost\th/pay\tHours\tSalary\n";
                cout << "--------------------------------------------------------------------------\n";
                
                for(int i = 0; i < (size - 1); i++)
                    arr[i].GetInfo();
 
                break;
            }
        }
        
        Worker *arr2 = new Worker[size];
        
        for(int i = 0; i < size; i++)
            memcpy(&arr2[i], &arr[i], sizeof(arr[i]));
            
        delete[]arr;
        
        Worker *arr = new Worker[size];
        
        for(int i = 0; i < size; i++)
            memcpy(&arr[i], &arr2[i], sizeof(copy[i]));
        
        delete[]arr2;
        
        cout << endl << endl;
        
    }while(action != 'q');
    
    delete[]arr;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.04.2018, 15:39
Помогаю со студенческими работами здесь

Динамическое выделение памяти для двумерного массива
нужна помощь вот тело программы, не могу сделать динамическое выделение памяти для первого двумерного массива. второй массив получается...

Динамическое выделение памяти для массива указателей на char
Доброго времени суток! пытаюсь выделить память для массива указателей на char следующий код #include &lt;iostream&gt; #include...

Динамическое выделение памяти и обработка массива с применением указателей
Уплотнить заданную матрицу, удалив из неё строки и столбцы, заполненные нулями. Найти номер первой из строк, содержащих хотя бы один...

Динамическое выделение памяти для строки
Подскажите, пожалуйста , почему в данной программе появляются ошибки в строке return Vector(v1.x + v2.x, v1.y + v2.y, v1.cp +...

Динамическое выделение памяти для структур
Добрый день. Есть следующие структуры: typedef struct __attribute__((aligned(16))) { float u, v; unsigned int color; ...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru