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: | ожидается проверка → ожидаются исправления |
---|
comment:2 Changed 3 years ago by
Type: | ожидаются исправления → ожидается проверка |
---|---|
Version: | 1.0 → 2.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
Type: | ожидаются исправления → ожидается проверка |
---|
comment:5 Changed 3 years ago by
Resolution: | → задача сдана |
---|---|
Status: | assigned → closed |
Тесты вроде бы проходят, но везде ругается валгринд.
Дать вам 4ю попытку я не могу, несмотря на продлённый дедлайн. Продление было нужно для тех, кто нулевой/первый дедлайн пропустил
Стиль:
Остались неисправленными замечания:
- Сейчас присутствует некоторая копипаста в Developer::write и SalesManager::write. Кажется, её можно вынести в Employee::write
- не везде выпилили \n
- при выводе на экран Sales Manager потерял пробел в словосочетании Sales Manager
6/10
Так, смотрите.
Действительно хочется уметь делать оператор << виртуальным. Но нельзя.
Более того, очень хочется уметь делать
А такой код предполагает, что оператор << будет определён для Employee, ибо указатели именно на эти сущности должны лежать в EmployeeArray?
То есть неизбежно оператор << (как и >>) должен быть объявлен для Employee. И вы можете сделать так, чтобы в теле этого оператора можно вызвать виртуальную функцию, которую в потомках определить по-разному. И тогда операторы << и >> потомкам не нужны вообще.
И, соответственно, вам нужны разные функции на работу с консолью и с файлом (хотя если вы сможете прикрутить сюда полиморфизм, будет здорово