0 / 0 / 0
Регистрация: 01.10.2015
Сообщений: 10
|
||||||
1 | ||||||
Сортировка элементов массива объектов в классе31.05.2016, 06:40. Показов 1816. Ответов 12
Метки нет Все метки)
(
Здравствуйте! Помогите пожалуйста найти ошибку в коде - я уже 2 дня над ней бьюсь...
Необходимо реализовать программу Телефонный справочник с использованием классов и деструкторов (это первое ДЗ по теме "Введение в ООП"). Программа содержит методы добавления/удаления, печати, поиска и сортировки записей. Класс Telefon - содержит инфо о полях каждой отдельной записи (абоненте). А класс Tel_kniga содержит массив объектов класса Telefon. Проблема возникла с функцией сортировки Sort_fio (). Без использования деструктора ~Telefon () - все работает. А вот с деструктором возникает ошибка: HEAP CORRUPTION DETECTED: after Normal block (#153). Заранее благодарна за помощь и любые замечания по программе. Вот код:
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
|
|
31.05.2016, 06:40 | |
Ответы с готовыми решениями:
12
Сортировка массива объектов класса Сортировка массива объектов функцией sort Сортировка массива объектов, созданных с помощью класса Найти количество чётных элементов массива. Реализовать в классе |
7275 / 6220 / 2833
Регистрация: 14.04.2014
Сообщений: 26,871
|
||||||
31.05.2016, 10:13 | 2 | |||||
Ты не там NULL присваиваешь. На кой чёрт это нужно в деструкторе, если объект уже уничтожается?
0
|
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
|
|
31.05.2016, 13:00 | 3 |
sv1tlana, У вас нарушение правила трех: вы не реализовали оператор присваивания.
В результате в 231 строке в tmp и Catalog[j + 1] есть указатели, которые указывают на одну и ту же память (Fio и dop_inf ). При выходе из if в 232 строке для tmp вызывается деструктор, который удаляет все, что выделено для класса и в Catalog[j + 1] остаются "висячие указатели".
0
|
0 / 0 / 0
Регистрация: 01.10.2015
Сообщений: 10
|
|
31.05.2016, 17:54 [ТС] | 4 |
avgoor, здравствуйте.
Я не могу понять почему происходит использование одной и той же памяти. Ведь я присваиваю значения, используя конструктор копирования (строка 35: Telefon (const Telefon &obj) ) Причем вызываю его принудительно... Вы не могли бы написать фрагмент кода, показывающий как правильно сделать обмен между двумя объектами.
0
|
7275 / 6220 / 2833
Регистрация: 14.04.2014
Сообщений: 26,871
|
|
31.05.2016, 18:36 | 5 |
У тебя и без этого неправильно. Сначала конструктор и длину исправь.
0
|
0 / 0 / 0
Регистрация: 01.10.2015
Сообщений: 10
|
|
31.05.2016, 18:47 [ТС] | 6 |
nmcf, здравствуйте.
Спасибо, что уделили внимание, но к сожалению, я только больше запуталась. Не могли бы Вы уточнить какой именно конструктор? Тот, который по умолчанию (строка 18)? И как его исправить? И где надо исправить длину?
0
|
7275 / 6220 / 2833
Регистрация: 14.04.2014
Сообщений: 26,871
|
|
31.05.2016, 19:22 | 7 |
Я же показал как. Просто замени.
Длину везде исправить, где память выделяешь через new.
0
|
0 / 0 / 0
Регистрация: 01.10.2015
Сообщений: 10
|
|||||||||||||||||||||
31.05.2016, 21:18 [ТС] | 8 | ||||||||||||||||||||
avgoor, я пыталась самостоятельно разобраться - стало "вылетать" чуть позже, но ошибка остается все равно:
Вот что я изменила: 1) Добавила конструктор присваивания копированием, согласно правилу трех:
0
|
7275 / 6220 / 2833
Регистрация: 14.04.2014
Сообщений: 26,871
|
|
31.05.2016, 21:20 | 9 |
Так, как у меня, делай, а не через равно NULL.
И где корректировка длины?
0
|
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
|
|
31.05.2016, 22:12 | 10 |
sv1tlana, 1) В операторе присваивания, если выделяете новую память, старую надо удалать раскомментируйте. 2) Когда выделяете память не забывайте о нуль-терминаторе (new char[strlen(...)+1])
1
|
0 / 0 / 0
Регистрация: 01.10.2015
Сообщений: 10
|
||||||
01.06.2016, 00:22 [ТС] | 11 | |||||
nmcf и avgoor, СПАСИБО ВАМ ОГРОМНОЕ! ЗАРАБОТАЛО!
Дело действительно было в том, что я неправильно устанавливала длину строки и не использовала конструктор присваивания копированием. Не верю своему счастью ![]() Не подскажете еще один момент: при сортировке - сортируются только фамилии с большой буквы, хотя используется функция stricmp, которая сравнивает без учета регистра символов. Вот исправленный код:
0
|
7275 / 6220 / 2833
Регистрация: 14.04.2014
Сообщений: 26,871
|
||||||
01.06.2016, 09:41 | 12 | |||||
Функция локалезависима. Надо включать русскую локаль на время сравнения.
1
|
0 / 0 / 0
Регистрация: 01.10.2015
Сообщений: 10
|
|
01.06.2016, 16:15 [ТС] | 13 |
nmcf , еще раз большое спасибо ! Подключила, теперь сортирует все как положено.
0
|
01.06.2016, 16:15 | |
Помогаю со студенческими работами здесь
13
В классе инициализировать массив, в классе создать функцию вывода массива на экран Использование объектов класса в другом классе Создать в классе массив объектов предыдущего класса Массив объектов класса в другом классе (композиция). Компилятор ругается на конструктор Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |