Opened 4 years ago

Closed 4 years ago

#997 closed ожидаются исправления (задача НЕ сдана)

WW #15

Reported by: Brilliantov Kirill Owned by: Egor Suvorov
Component: WW_linq Version: 1.0
Keywords: Cc:

Description


Change History (1)

comment:1 Changed 4 years ago by Egor Suvorov

Resolution: задача НЕ сдана
Status: assignedclosed
Type: ожидается проверкаожидаются исправления

Можно договориться и дорешать на баллы.

Корректность: 2.5/7

  • Не компилируется с предупреждениями (это стиль в том числе):
       In file included from src/linq_tests.cpp:1:
    ../../../cpp19/brilliantov.kirill/lab_15/include/linq.hpp:121:20: error: 'operator bool' overrides a member function but is not marked 'override' [-Werror,-Winconsistent-missing-override]
      virtual explicit operator bool() {
                       ^
    ../../../cpp19/brilliantov.kirill/lab_15/include/linq.hpp:36:42: note: in instantiation of template class 'linq::impl::drop_enumerator<int>' requested here
      auto drop(int count) noexcept { return drop_enumerator<T>(*this, count); }
                                             ^
    src/linq_tests.cpp:100:15: note: in instantiation of member function 'linq::impl::enumerator<int>::drop' requested here
                 .drop(2).to_vector();
                  ^
    ../../../cpp19/brilliantov.kirill/lab_15/include/linq.hpp:34:20: note: overridden virtual function is here
      virtual explicit operator bool() = 0;
                       ^
    ../../../cpp19/brilliantov.kirill/lab_15/include/linq.hpp:157:20: error: 'operator bool' overrides a member function but is not marked 'override' [-Werror,-Winconsistent-missing-override]
      virtual explicit operator bool() { return cur_ < count_; }
                       ^
    ../../../cpp19/brilliantov.kirill/lab_15/include/linq.hpp:38:42: note: in instantiation of template class 'linq::impl::take_enumerator<int>' requested here
      auto take(int count) noexcept { return take_enumerator<T>(*this, count); }
                                             ^
    src/linq_tests.cpp:110:31: note: in instantiation of member function 'linq::impl::enumerator<int>::take' requested here
      auto res = from(begin, end).take(4).until_eq(-1).to_vector();
                                  ^
    ../../../cpp19/brilliantov.kirill/lab_15/include/linq.hpp:34:20: note: overridden virtual function is here
      virtual explicit operator bool() = 0;
                       ^
    2 errors generated.
    
  • Лучше всё-таки возвращать const T& operator*. То, что ругался компилятор в select — скорее всего по делу и там реально временный объект не доживал до конца. Например, если он создаётся из-за неявного преобразования внутри функции, то он умирает при выходе из функции.
  • Много копирований функторов не по делу.
  • Падают ассёрты на автотестах:
    • take:
      linq_tests: ../../../cpp19/brilliantov.kirill/lab_15/include/linq.hpp:87: virtual T linq::impl::range_enumerator<int, std::__1::__wrap_iter<int *> >::operator*() [T = int, Iter = std::__1::__wrap_iter<int *>]: Assertion `static_cast<bool>(*this)' failed.
      
    • drop: неверный ответ: ожидался пустой вектор, получилось что-то другое.
    • until
      linq_tests: ../../../cpp19/brilliantov.kirill/lab_15/include/linq.hpp:87: virtual T linq::impl::range_enumerator<int, std::__1::__wrap_iter<int *> >::operator*() [T = int, Iter = std::__1::__wrap_iter<int *>]: Assertion `static_cast<bool>(*this)' failed.
      

Стиль 0.5/3:

  • drop и where не должны никак мешать константности operator bool и operator*.
  • Не хватает слов final, explicit (конструктор), noexcept, override, и rvalue-ref-qualifier у методов.
    • При этом если есть override, то virtual надо убрать.
  • Не хватает виртуального деструктора в полиморфном классе enumerator. Конкретно в этой задаче это ни на что не влияет, но привычка полезная.
  • У enumerator стоит запретить копирование и перемещение — это точно ошибки. Перемещение можно запрещать, начиная с C++17 из-за copy elision.
  • static_cast<bool> в ||, &&, if, while как раз не нужен. explicit operator bool ровно там работает.
  • Вместо вызова operator*() и operator++() лучше писать **this или ++*this, операторы обычно вызываются всё-таки как операторы.
  • И ещё наверняка захочется пройтись по именам вроде next_avail/drop и сделать их глаголами и синхронизированными друг с другом.
Note: See TracTickets for help on using tickets.