Opened 3 years ago

Closed 3 years ago

#488 closed ожидается проверка (задача сдана)

WW_cpp_io Garaev Timur lab_10

Reported by: Garaev Timur Owned by: Антон Филатов
Component: WW cpp_io Version: 2.0
Keywords: Cc:

Description

Тут пока совсем сыро. Но можно я потрачу нулевую попытку на то, чтобы немного прояснить, куда мне двигаться дальше? Я не понимаю как сделать универсальный >> и <<. Второй выводит просто адрес, а первый вообще не компилируется.

Нам нужно что-то в духе virtual friend func в employee, но компилятор ругает меня забавным сообщением : "virtual функции не могут быть друзьями".

Change History (5)

comment:1 Changed 3 years ago by Антон Филатов

Type: ожидается проверкаожидаются исправления

Так, смотрите.
Действительно хочется уметь делать оператор << виртуальным. Но нельзя.
Более того, очень хочется уметь делать

EmployeeArray arr;
for <несколько раз>
  arr.push_back(<Developer> или <SalesManager>)

for (elem : arr) {
  cout << elem
}

А такой код предполагает, что оператор << будет определён для Employee, ибо указатели именно на эти сущности должны лежать в EmployeeArray?

То есть неизбежно оператор << (как и >>) должен быть объявлен для Employee. И вы можете сделать так, чтобы в теле этого оператора можно вызвать виртуальную функцию, которую в потомках определить по-разному. И тогда операторы << и >> потомкам не нужны вообще.

И, соответственно, вам нужны разные функции на работу с консолью и с файлом (хотя если вы сможете прикрутить сюда полиморфизм, будет здорово

comment:2 Changed 3 years ago by Garaev Timur

Type: ожидаются исправленияожидается проверка
Version: 1.02.0

Вроде заработало! Пока, только, не разобрался с разделителями в бинарном файле. Как это должно работать, чтобы читалось? У меня пробелы, но это точно плохо должно быть.

comment:3 Changed 3 years ago by Антон Филатов

Type: ожидается проверкаожидаются исправления

Для бинарной записи в файл надо пользоваться функциями типа ofstream.write(что, сколько байт) вроде такой синтаксис
Тогда вам не нужны разделители, поскольку вы явно указываете размер типа, ну и при чтении тоже указываете явно

Пока тесты не проходят никакие, поскольку у вас команды называются не так, как в задании.

Стиль:

  • Вот такой код плохо делать:
int32_t Developer::get_type() const {
	return 1;
}

По сути вы хардкодите константу где-то очень глубоко в файле. А это не просто внутренняя константа - вы её прям пользователю на экран пишете.
Поэтому по-хорошему надо id вынести в константу класса. Ну и это можно сделать базовому классу, чтобы не копипастить тело функции get_type

  • Сейчас присутствует некоторая копипаста в Developer::write и SalesManager::write. Кажется, её можно вынести в Employee::write
  • вместо \n можно пользоваться std::endl
  • Вот от этой копипасты нужно избавляться
	Employee *cur = nullptr;
	if (type == 1) {
		char* name = new char [100];
		cur = new Developer(name, 0, 0);
	} else {
		char* name = new char [100];
		cur = new SalesManager(name, 0, 0, 0);
	}

Проще всего положить в отдельную функцию. Только подумайте, какому классу её лучше отдать

Пока это 4/10, но кажется, что быстро допиливается до более высоких баллов

comment:4 Changed 3 years ago by Garaev Timur

Type: ожидаются исправленияожидается проверка

comment:5 Changed 3 years ago by Антон Филатов

Resolution: задача сдана
Status: assignedclosed

Тесты вроде бы проходят, но везде ругается валгринд.
Дать вам 4ю попытку я не могу, несмотря на продлённый дедлайн. Продление было нужно для тех, кто нулевой/первый дедлайн пропустил

Стиль:
Остались неисправленными замечания:

  • Сейчас присутствует некоторая копипаста в Developer::write и SalesManager::write. Кажется, её можно вынести в Employee::write
  • не везде выпилили \n
  • при выводе на экран Sales Manager потерял пробел в словосочетании Sales Manager

6/10

Note: See TracTickets for help on using tickets.