1. C++ / Говнокод #25924

    +4

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    // File.cpp
    QString File::size() const
    {
        return QString::number(QFileInfo(m_path).size());
    }
    
    // ... somewhere in the code...
    
    File* message = ...
    ...
    if (message->size() == "0")
            return;

    Commit b1aef142 "Refactoring"
    Р - Рефакторинг

    Запостил: salamon_style, 10 Октября 2019

    Комментарии (42) RSS

    • Ну, разве что если это какой-нибудь промежуточный класс для отображения в интерфейсе, сделанном на Quick/QML. На случай, если нужно будет добавить значения типа "<unknown>".
      Но сравнение все равно подозрительное.

      P.S. quick ui quick!
      Ответить
      • Нет, это файл модели, в которой хранятся все данные. UI тут пока и не пахнет :) Отображать размер на UI тоже не планируется
        Ответить
      • Кстати, а для класса QString сравнение перегружено или будут сравниваться указатели?
        Ответить
        • Конечно, перегружено, и сравнивает содержимое строк.
          А вот если оператор сравнения в структуре не перегрузить, то
          ...
          черт.
          Забыл. То ли будет пополевое сравнение, то ли сравнение будет не определено. Скорее, второе. Но точно не сравнение адресов.
          Ответить
          • Поругается на отсутствие перегруженного оператора, ЕМНИП.
            Ответить
          • Будет тоже самое, что и с классом - ошибка компиляции. Все отличие class от struct в том, что модификаторы доступа дефолтные разные: private у class и public у struct, больше ничего
            Ответить
            • Это понятно, просто я забыл, генерируется ли оператор== по умолчанию. Ну и мало ли в новом стандарте как-нибудь по-другому.
              Ответить
              • показать все, что скрытоМеня и си нахуй послало

                foo.c:4:13: error: invalid operands to binary == (have ‘struct a’ and ‘struct a’)

                и плюсы
                foo.c:4:13: error: no match for ‘operator==’ (operand types are ‘a’ and ‘a’)


                А в коко есть датаклассы, и в C# структуры есть тоже.
                Выходит что в C++ эту питушню надо руками генерировать?
                Ответить
              • Ага, они тут оператор <=> (three-way comparison) введут в C++20 (это не шутка!), который можно будет сгенерировать (и одновременно все оставшиеся 6 операторов сравнения: >, <, >=, <=, ==, !=)


                https://en.cppreference.com/w/cpp/language/operator_comparison#Three-way_comparison
                https://en.cppreference.com/w/cpp/language/default_comparisons


                А я еще когда-то угорал с JS и его === :(
                Ответить
                • показать все, что скрытоэто чтоль летающая тарелка для сравнения как в перле?

                  а можно его так переопределить чтобы

                  a> b == true
                  a < b == false
                  (a <=> b) == 0
                  Ответить
                  • Тип того, но тут не -1, 0, 1 будет возвращать, а один из 5 ordering типов (по второй ссылке, что скинул выше, есть примеры). Но я пока боюсь это трогать :)
                    Ответить
                    • std::strong_ordering::equal
                      std::strong_equality::equal
                      std::partial_ordering::equivalent
                      std::weak_ordering::equivalent
                      std::weak_equality::equivalent

                      И это я перечислил не все значения... Как всё сложно...
                      Ответить
                • auto operator<=>(const Point&) const = default;

                  Вот так и думал, что в новом стандарте что-то такое введут.
                  Ответить
          • Ты перепутал с C#:там структура это value type и будет попо-левое сравнение

            В C++ struct это синоним класса просто там всё public.
            Ответить
    • а поясните для питухов, как скомпилируется возвращение нумбера, когда в сигнатуре стринг?
      Ответить
      • [static] QString QString::number(int n, int base = 10)
        Просто переводит число в строчку
        Ответить
        • божемой) я был уверен, что number возвращает нумбер

          Тогда это какой-то пыхокод: использовать строку там, где нужно число
          Ответить
        • https://govnokod.ru/25937
          Ответить
      • QString File::size() const
        {
          return 123;
        }
        Это не скомпилируется, поскольку в QString нет неявного конструктора/преобразования из int.
        А QString::number(int) возвращает QString.
        Ответить
    • Блядь, зачем размер фала возвращать строкой?
      Ответить
    • давай
      Ответить

    Добавить комментарий