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: ожидается проверкаожидаются исправления

Что-то оно зациклилось при чтении файлика размером 345 байт.
Что-то с форматом не так, скорее всего.

Зачем отдельные перегрузки операторов для каждого типа, если у вас есть виртуальный метод чтения/записи?

манипуляторы для c-строк должны работать с c-строками. Иначе какой в них смысл?

Константы для типов объектов у вас зачем-то протекли в main.cpp -- теперь их нужно поддерживать в трех местах. Они дублируются в реализации + в пользовательском коде. Лучше сделать фабричную функцию, а магические константы заменить на enum.

comment:2 Changed 4 years ago by Vladislav Nosivskoy

Что значит отдельные перегрузки? Вроде как у меня сейчас перегружены операторы только для Employee и EmployeesArray?, да, это можно было не делать, но это вроде для удобства, чтобы не использовать поля в пользовательском коде, а просто читать/выводить.

Про константы ок, но что такое "сделать фабричную функцию"?

comment:3 Changed 4 years ago by Vladislav Nosivskoy

Кстати, вроде же разрешили работать с std::string, а не сишными строками. Да и у манипуляторов в названиях нигде не указана принадлежность к c-строкам.

comment:4 Changed 4 years ago by Vladislav Nosivskoy

Owner: changed from Vladislav Nosivskoy to Дмитрий Свиридкин
Type: ожидаются исправленияожидается проверка

(Меняю тип тикета, чтобы вы прочли комменты, код не изменился)

comment:5 in reply to:  3 Changed 4 years ago by Дмитрий Свиридкин

Replying to Vladislav Nosivskoy:

Кстати, вроде же разрешили работать с std::string, а не сишными строками. Да и у манипуляторов в названиях нигде не указана принадлежность к c-строкам.

В задании требовался манипулятор для c-строк

Манипуляторы для ввода-вывода строк в стиле Си (тип char*):

Именя *_с_str говорят о принадлежности к C-строкам

comment:6 in reply to:  2 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 Vladislav Nosivskoy

Type: ожидаются исправленияожидается проверка
Version: 1.02.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 Vladislav Nosivskoy

Owner: changed from Vladislav Nosivskoy to Дмитрий Свиридкин
Type: ожидаются исправленияожидается проверка
Version: 2.03.0

comment:11 Changed 4 years ago by Дмитрий Свиридкин

Resolution: задача сдана
Status: assignedclosed
   s.setstate(std::ios_base::badbit);
   std::cerr << "BAD FORMAT" << std::endl;

Флажок выставить -- хорошо.
А вот писать что-то в лог/cerr/cout должен будет пользовательский код. Манипулятор тут ни при чем.
Вдруг, cin/cout/cerr -- один и тот же файл, открытый на чтение и запись одновременно? И читая вашим манипулятором из cin, пользователь внезапно испортит себе файл.


9.7

Note: See TracTickets for help on using tickets.