1186 / 542 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
|
||||||||||||||||
1 | ||||||||||||||||
Покритикуйте код02.10.2011, 23:28. Показов 8263. Ответов 116
Метки нет (Все метки)
Есть класс Студенты (реализован через односвязный список), хотел бы услышать критику по поводу его улучшения, если кому не лень разбираться в столь поздний час Сам код естественно полностью рабочий и предупреждений тоже компилятор не выдаёт (если не считать в main в условии while, но там всё ок) так что хотелось бы услышать Ваши замечания если что можно сделать лучше.
Students.h
0
|
02.10.2011, 23:28 | |
Ответы с готовыми решениями:
116
Покритикуйте код Графы. Покритикуйте код Пожалуйста, покритикуйте код Покритикуйте код финкции нахождения интеграла |
02.10.2011, 23:39 | 2 | ||||||||||
Gepar, поехали. Первое, что бросается в глаза:
Я бы сделал так:
1
|
Каратель
|
|||||||||||
02.10.2011, 23:40 | 3 | ||||||||||
определись с использованием либо 0 либо NULL для указателей
1
|
1186 / 542 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
|
|
02.10.2011, 23:47 [ТС] | 4 |
talis, это сейчас допишу как бонус, хотя итераторы изначально прикручены и через них печать сделана на пробу потому как препод сказал что мол в 5ой лабораторной к этому всему нужно будет прикрутить интерфейс, а там мол никаких потоков cout вам не будет и всё такое так что делайте так чтобы можно было выводить данные вне класса как-то.
Jupiter, константность поправил. Добавлено через 1 минуту Ну так бы не понадобилось передавать ссылку в функцию, а я хотел оставить этот "старый стиль" с передачей в класс функции, чисто для демонстрации преподавателю )
0
|
02.10.2011, 23:56 | 5 | |||||||||||||||||||||||||
Итератор - это средство доступа к элементу списка. Элементом списка является CStudent. А всякие там подробности реализации в виде указателя на следующий элемент оставьте внутри класса, пользователю класса их знать не обязательно. Итератор при "разыменовывании" возвращает ссылку на CStudent, с которым пользователь уже и работает. CStudent сам обеспечивает себя функциями доступа к fullname, year и прочим полям. Это не забота итератора. Итератор занимается обходом списка и не должен вникать в реализацию CStudent. Он должен просто возвращать ссылку на него и всё. А у вас итератор является интерфейсом доступа к студенту, а студент - это некая абстрактная сущность, которая весьма посредственно выделена из общей серой массы содержимого элемента списка. А что, если я захочу часть студентов загнать во внешний массив, или ещё что-то с ними сделать? Да элементарно, почему при изменении структуры студента я должен менять класс итератора списка? Как говорил умный дядя Страуструп, если вы думаете об этом как об отдельной сущности, создайте для этого класс. Рассматривайте студента как одну, самостоятельную сущность, список - как другую, элемент списка (который содержит студента) - как третью, а итератор списка - как четвёртую. Чётко разграничьте полномочия.
1
|
1186 / 542 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
|
|
03.10.2011, 00:14 [ТС] | 6 |
Меня в прошлой теме кто-то поравил что "разименованный" итератор должен возвращать *this, те себя и я чуть изменил оператор*, ну да сейчас попробую реализовать Ваши советы по поводу улучшения класса.
Добавлено через 4 минуты Хотя насчёт доступа через итераторы на редактирование я вот не знаю должна ли быть такая возможность у меня, ведь так можно будет обходить проверки и редактировать напрямую список ...
0
|
03.10.2011, 00:19 | 8 |
Ага! Вот вы и попались. Действительно, почему итератор должен заботиться о том, как правильно редактировать объект и делать все проверки? У нас самообслуживание. Пусть CStudent сам о себе заботится, и сам решает, как себя редактировать. А то свалили, понимаешь, всю работу на итераторы - и они горбатятся, бедные
Добавлено через 1 минуту А чтобы запретить редактирование - сделайте ещё class const_iterator, который при "разыменовывании" возвращает const CStudent & - и никто не сможет редактировать объект по ссылке.
1
|
1186 / 542 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
|
||||||||||||||||
03.10.2011, 00:44 [ТС] | 9 | |||||||||||||||
talis, ну в принципе Вы правы, после редактирования класс сейчас выглядит так:
Students.h
CStudent сделана public так как иначе я не смогу её напечатать в main (он ругается что эта структура в классе Students private и мол потому нельзя чтобы функция print в main принимала её в виде параметра)...
0
|
03.10.2011, 00:50 | 10 | |||||||||||||||
Пока ListItem находится в private или protected, то есть не виден снаружи, ничего страшного. Хотя, может, эксперты скажут тут своё гав
Плохим тоном считается наличие конструктора у struct. Лучше бы их сделать class. Параметры конструктора ListItem
У класса CStudent всё-таки советую сделать конструктор и
1
|
1186 / 542 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
|
|
03.10.2011, 00:57 [ТС] | 11 |
добавлять элементы удобнее, сразу половина проверок в конструкторе + можно ещё добавить проверки только здесь и больше нигде ,если препод придерётся (а он чувствую придерётся). Не будь там конструктора -при каждом добавлении через любой метод класса куда-либо в список элемента нужно все данные проверять, те проверок бы добавилось много.
Но тогда не будет видно в print, хотя если я сейчас перегружу вывод в поток то print и не понадобится, но тем не менее то что не будет возможности вывести данные в main какраз и будет означать что в сл. лабораторных это мне помешает так как мне точно придётся данные через main выводить. Ну я могу сделать его классом и отметить всё public, наличие конструктора у класса плохим тоном не считается ведь
0
|
03.10.2011, 01:00 | 12 | |||||||||||||||
Параметры студента должны быть в конструкторе студента, а не в конструкторе элемента списка. Почему?
1
|
1186 / 542 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
|
|
03.10.2011, 01:06 [ТС] | 13 |
Ну тоже вариант ) Добавил проверку что current до этого не был уже ==0.
В постфиксном тоже самое. Так это же при создании, а при добавлении (addToHead, addToTail). Ну потому что всё отправляется в ostream поток таким образом, а прямого доступа к элементам из main не остаётся, а он вроде будет надо насколько я понял (я под win приложения с интерфейсом не писал так что не знаю как оно на самом деле) из слов преподавателя.
0
|
03.10.2011, 01:13 | 14 | |||||
Gepar, вы немного не поняли. (*it) вернёт вам ссылку на CStudent, и по этой ссылке вы будете работать с объектом класса CStudent. Если вы в классе CStudent сделаете интерфейс доступа к элементам, то сможете работать через него.
Ахххахаа!! А я-то думаю, в чём дело Под "интерфейсом" препод имел ввиду не графический интерфейс пользователя, а программный интерфейс доступа к объекту. Функции доступа Добавлено через 2 минуты
0
|
1186 / 542 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
|
|
03.10.2011, 01:13 [ТС] | 15 |
talis, не-не, под интерфейсом там именно интерфейс, препод своих примеров понапихивал написанных так вот там есть у него лаба с "мордой", не знаю какая по счёту она будет.
0
|
03.10.2011, 01:17 | 16 | |||||
Ну и дальше обращение через интерфейс
Н-да?.. Ну это сути не меняет. Красивый графический интерфейс не отменяет хороший программный
0
|
1186 / 542 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
|
||||||||||||||||||||||||||
03.10.2011, 01:23 [ТС] | 17 | |||||||||||||||||||||||||
Странно, что-то не срабатывает моя перегрузка оператора...
итератор:
Добавлено через 2 минуты Хотя я вспомнил что перегрузка же должна быть отдельно от объявления, и всё же почему не подходит cpp файл, это разве не отдельно (из main компилируется если в main запихнуть код перегрузки) ?
0
|
1186 / 542 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
|
|
03.10.2011, 01:33 [ТС] | 19 |
talis, об этом компилятор мне напомнил и это я добавил уже когда смог скомпилировать проэкт.
it - Students::iterator конечно, я сейчас попробую ещё в vs скомпилировать когда перегрузка находится в cpp файле, а не в main. Добавлено через 2 минуты А VS компилирует нормально, это только minigw чего-то обижается ... ну да ладно, так как уже поздно то я буду спать, думаю класс уже не столь страшен после Вашей критики так что можно и на глаза преподавателю его показать ) Спасибо за помощь в поиске bug'ов и недочётов класса
0
|
03.10.2011, 01:33 | 20 | |||||
а должно быть
0
|
03.10.2011, 01:33 | |
03.10.2011, 01:33 | |
Помогаю со студенческими работами здесь
20
Покритикуйте и помогите улучшить код моей игры Покритикуйте пожалуйста программу Покритикуйте мою игру Шифратор пароля. Покритикуйте пожалуйста. Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |