Opened 4 years ago
Closed 4 years ago
#663 closed ожидается проверка (задача сдана)
WW #11
Reported by: | Vladislav Nosivskoy | Owned by: | Дмитрий Свиридкин |
---|---|---|---|
Component: | WW cpp_io | Version: | 3.0 |
Keywords: | Cc: |
Description
Change History (11)
comment:1 Changed 4 years ago by
Owner: | changed from Дмитрий Свиридкин to Vladislav Nosivskoy |
---|---|
Type: | ожидается проверка → ожидаются исправления |
comment:2 follow-up: 6 Changed 4 years ago by
Что значит отдельные перегрузки? Вроде как у меня сейчас перегружены операторы только для Employee и EmployeesArray?, да, это можно было не делать, но это вроде для удобства, чтобы не использовать поля в пользовательском коде, а просто читать/выводить.
Про константы ок, но что такое "сделать фабричную функцию"?
comment:3 follow-up: 5 Changed 4 years ago by
Кстати, вроде же разрешили работать с std::string, а не сишными строками. Да и у манипуляторов в названиях нигде не указана принадлежность к c-строкам.
comment:4 Changed 4 years ago by
Owner: | changed from Vladislav Nosivskoy to Дмитрий Свиридкин |
---|---|
Type: | ожидаются исправления → ожидается проверка |
(Меняю тип тикета, чтобы вы прочли комменты, код не изменился)
comment:5 Changed 4 years ago by
Replying to Vladislav Nosivskoy:
Кстати, вроде же разрешили работать с std::string, а не сишными строками. Да и у манипуляторов в названиях нигде не указана принадлежность к c-строкам.
В задании требовался манипулятор для c-строк
Манипуляторы для ввода-вывода строк в стиле Си (тип char*):
Именя *_с_str говорят о принадлежности к C-строкам
comment:6 Changed 4 years ago by
Replying to Vladislav Nosivskoy:
Что значит отдельные перегрузки? Вроде как у меня сейчас перегружены операторы только для Employee и EmployeesArray?, да, это можно было не делать, но это вроде для удобства, чтобы не использовать поля в пользовательском коде, а просто читать/выводить.
Про константы ок, но что такое "сделать фабричную функцию"?
А это кто такие?
std::ostream& operator<<(std::ostream&, const Developer&); std::istream& operator>>(std::istream&, Developer&); std::ofstream& operator<<(std::ofstream&, const Developer&); std::ifstream& operator>>(std::ifstream&, Developer&);
Фаубричная функция -- функция, которая сама определит тип объекта и сконструирует его по переданным параметрам. В вашем случае какой-нибудь статический метод
Employee* EmployeesArray::ReadEmployee(std::istream&)
comment:7 Changed 4 years ago by
Type: | ожидается проверка → ожидаются исправления |
---|
comment:8 Changed 4 years ago by
Type: | ожидаются исправления → ожидается проверка |
---|---|
Version: | 1.0 → 2.0 |
comment:9 Changed 4 years ago by
Owner: | changed from Дмитрий Свиридкин to Vladislav Nosivskoy |
---|---|
Type: | ожидается проверка → ожидаются исправления |
void add_emplyee(EmployeesArray &arr) { Employee *e = read_employee(); assert(e != nullptr); arr.add(e); }
А откуда оно читает? Из cin? Неявные параметры -- зло. Передавайте istream& явно
Магические константы остались магическими во всяких методах write()
int32_t size_array; s >> read_le_int32(size_array);
Если чтение не удастся, в зависимости от стандарта, будет ноль или мусор. Инициализируйте явно переменные встроеннных типов.
if (current_index == sz && current_byte != 0) { std::cerr << "BAD FORMAT" << std::endl; assert(true); }
Слишком радикально. Там у потока вроде как флажки есть...
манипуляторы в операторы стоит передавать по константной ссылке
7.5/10
comment:10 Changed 4 years ago by
Owner: | changed from Vladislav Nosivskoy to Дмитрий Свиридкин |
---|---|
Type: | ожидаются исправления → ожидается проверка |
Version: | 2.0 → 3.0 |
comment:11 Changed 4 years ago by
Resolution: | → задача сдана |
---|---|
Status: | assigned → closed |
s.setstate(std::ios_base::badbit); std::cerr << "BAD FORMAT" << std::endl;
Флажок выставить -- хорошо.
А вот писать что-то в лог/cerr/cout должен будет пользовательский код. Манипулятор тут ни при чем.
Вдруг, cin/cout/cerr -- один и тот же файл, открытый на чтение и запись одновременно? И читая вашим манипулятором из cin, пользователь внезапно испортит себе файл.
9.7
Что-то оно зациклилось при чтении файлика размером 345 байт.
Что-то с форматом не так, скорее всего.
Зачем отдельные перегрузки операторов для каждого типа, если у вас есть виртуальный метод чтения/записи?
манипуляторы для c-строк должны работать с c-строками. Иначе какой в них смысл?
Константы для типов объектов у вас зачем-то протекли в main.cpp -- теперь их нужно поддерживать в трех местах. Они дублируются в реализации + в пользовательском коде. Лучше сделать фабричную функцию, а магические константы заменить на enum.