Change History (2)

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

Owner: changed from Дмитрий Свиридкин to Анна Михайлова
Type: ожидается проверкаожидаются исправления
   int len = 0;
   std::streampos pos = is.tellg();
   char c = 'a';
   while (c) {
	is.read(&c, 1);
	len++;
  }
  is.seekg(pos);
  _name = new char[len];

Получается, вы два раза одно и то же читаете, чтоб неправильно размер буфера посчитать... В сулчае c-строк у вас обычно размер буфера фиксирован. И скорее всего оговорен в условии.

==21639== Invalid read of size 1
==21639==    at 0x10BE24: operator>>(std::basic_ifstream<char, std::char_traits<char> >&, read_c_str const&) (bin_manip.cpp:53)
==21639==    by 0x10ADC6: SalesManager::read_binary(std::basic_ifstream<char, std::char_traits<char> >&) (employees.cpp:102)
==21639==    by 0x10A5F7: operator>>(std::basic_ifstream<char, std::char_traits<char> >&, Employee&) (employees.cpp:22)
==21639==    by 0x10B0B6: operator>>(std::basic_ifstream<char, std::char_traits<char> >&, EmployeesArray&) (employees.cpp:130)
==21639==    by 0x10B734: main (main.cpp:14)
==21639==  Address 0x4de7554 is 0 bytes after a block of size 4 alloc'd
==21639==    at 0x483B583: operator new[](unsigned long) (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
==21639==    by 0x10AD8B: SalesManager::read_binary(std::basic_ifstream<char, std::char_traits<char> >&) (employees.cpp:101)
==21639==    by 0x10A5F7: operator>>(std::basic_ifstream<char, std::char_traits<char> >&, Employee&) (employees.cpp:22)
==21639==    by 0x10B0B6: operator>>(std::basic_ifstream<char, std::char_traits<char> >&, EmployeesArray&) (employees.cpp:130)
==21639==    by 0x10B734: main (main.cpp:14)
==21639== 
==21639== Invalid read of size 1
==21639==    at 0x10BE24: operator>>(std::basic_ifstream<char, std::char_traits<char> >&, read_c_str const&) (bin_manip.cpp:53)
==21639==    by 0x10A974: Developer::read_binary(std::basic_ifstream<char, std::char_traits<char> >&) (employees.cpp:59)
==21639==    by 0x10A5F7: operator>>(std::basic_ifstream<char, std::char_traits<char> >&, Employee&) (employees.cpp:22)
==21639==    by 0x10B049: operator>>(std::basic_ifstream<char, std::char_traits<char> >&, EmployeesArray&) (employees.cpp:126)
==21639==    by 0x10B734: main (main.cpp:14)
==21639==  Address 0x4de7606 is 0 bytes after a block of size 6 alloc'd
==21639==    at 0x483B583: operator new[](unsigned long) (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
==21639==    by 0x10A939: Developer::read_binary(std::basic_ifstream<char, std::char_traits<char> >&) (employees.cpp:58)
==21639==    by 0x10A5F7: operator>>(std::basic_ifstream<char, std::char_traits<char> >&, Employee&) (employees.cpp:22)
==21639==    by 0x10B049: operator>>(std::basic_ifstream<char, std::char_traits<char> >&, EmployeesArray&) (employees.cpp:126)
==21639==    by 0x10B734: main (main.cpp:14)

Почините, и будет работать.

	static const int32_t DEVELOPER_TYPE;
	static const int32_t MANAGER_TYPE;

Статические константы можно инициализировтаь на месте объявления. Но лучше enum.

Преопределения методов следует помечать override.
В объявлениии метода используется либо virtual, либо override, либо final. Синтаксис позволяет указывать и virtual и override одноверменно, но лучше не надо.

Из main код, разбирающий тип объекта, стоит вынести. Это не часть пользовательского кода -- этим должен заниматься функционал модуля.
virtual -- для первого объявления, остальные для переопределений.

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

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

5.5/10

Note: See TracTickets for help on using tickets.