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

    +3

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    #include <iostream>
     
    class A
    {
    public:
        virtual void print(int val = 10) { std::cout << "A" << val; }
    };
     
    class B : public A
    {
    public:
        virtual void print(int val = 20) { std::cout << "B" << val; }
    };
     
    int main()
    {
        B b;
        A& a = b;
        a.print();
        return 0;
    }

    when you see it, you’ll shit bricks

    Запостил: Tonghost, 26 Июля 2016

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

    • ходили, наступали. мораль: (А) на дефолты полагатся нельзя и (Б) хардкоженые значения (дефолты) в хидерах еще один гвоздь в гробу двоичной совместимости. (последнее как раз и было теми самыми граблями по которым я ходил очень долго. 0/NULL/std::string() еще кое как, но что большее - избегать и обходить стороной.)
      Ответить
      • При чем тут совместимость то?
        Ответить
        • двоичная совместимость тут при том что дефолты уже лежат в объектных файлах скомпилированых с хидером. смена дефолта в хидере не влияет на объектники. внутри одного проекта это мелочи. а вот интерфейсы между проектами и библиотеками...

          у меня было как раз такая байда, когда 3rd party послало кастомером новую версию библиотеки и сказало что все пофиксили. когда стали разбиратся почему все стало еще хуже, выяснилось что они там дефолтные айди с 0 на -1 поменяли в нескольких местах - в дефолтах в хидерах. двоичной совместимости не меняется - сигнатуры методов/классов не поменялись. но все равно ни хера не работало потому что наша софтина была скомпилирована с хидерами с дефолтом 0, что компилер послушно и вставил в наш объектный код.
          Ответить
          • А разве не положено при любом изменении хидера пересобирать все фалы использующие его?
            Ответить
            • нет. есть Н-ое количество изменений которые не требуют полной перекомпиляции.

              https://community.kde.org/Policies/Binary_Compatibility_Issues_With_C%2B%2B

              и к слову они упоминают:

              "You can [...] change the default arguments of a method. It requires recompilation to use the actual new default argument values, though."
              Ответить
          • а чья это вина что вы не перекомпилили код после изменения интерфейса либы?
            Ответить
            • 3rd party. они либу с "фиксами" послали прямо кастомеру.

              да даже если бы нам послали, то никто бы специального нового релиза/хот-фикса не делал, т.к. они сказали что ничего в интерфейсе не поменялось - только внутри самой библиотеки.
              Ответить
    • Это ты еще до правил выбора перегрузки не добрался. Вот где начинается сиплюсплюс.
      Ответить
      • ну тут сиплюсплюс и не приделах вообще

        https://ideone.com/KBn769

        ожидаемое стандартное поведение
        Ответить
        • То, что твой сисярп с плюсов и джавы слизали, не означает, что сиплюплюс не при делах. Вот тебе поведение из другого языка:
          >>> class A:
          ...     def f(self, x = 100500):
          ...         print "A", x
          ...
          >>> class B:
          ...     def f(self, y = 1488):
          ...         print "B", y
          ...
          >>> x = A()
          >>> x.f()
          A 100500
          >>> x = B()
          >>> x.f()
          B 1488
          Ответить
          • Но ведь и в крестах так же: http://coliru.stacked-crooked.com/a/76ca318c2f6628ff
            Ответить
            • Адово улучшил пример:
              >>> class A:
              ...     def f(self, x = 1337):
              ...         print "A", x
              ...     def g(self):
              ...         self.f()
              ...
              >>> class B(A):
              ...     def f(self, y = 1488):
              ...         print "B", y
              ...
              >>> x = A()
              >>> x.g()
              A 1337
              >>> x = B()
              >>> x.g()
              B 1488
              Ответить
              • дак это ж динамика, ну

                тип объекта вычисляется в рантайме, конечно известно что будет вызван B::g(1488) ибо в данном случае 'x' не является интерфейсом
                Ответить
              • В чем проблема-то?
                Ответить
    • Дайте ссылку на результат для ленивых
      Ответить
      • Вот: результат
        Ответить
        • Лень кликать, словами перескажи что там
          Ответить
          • Там буква и число выводятся. B10

            Кстати, интересно, будет ли в C++ аналог virtual для значений по умолчанию.
            virtual void print(virtual int val = 20) // так всё работает
            Ответить
    • А вы чего ждали? Вызов функции A::print() это синтаксический сахар над A::print(10) независимо от того, виртуальная эта функция или нет.
      Ответить
    • Виртуальные функции связываются динамически.
      Значение аргументов по умолчанию - статически.
      Ответить
    • Вот и вырасло поколение, не читавшее Мейрса

      Item 37: Never redefine a function's inherited default parameter value

      NVI, вот это всё
      Ответить
      • Never define function with default parameter values.
        Ответить
        • > Never define function with default parameter values.

          Я обычно так и делаю.
          Пишу две функции, прячу константы в .cpp-файле. Это гораздо надёжнее, особенно, если дефолты — объекты нетривиальных классов. Кмк, в жабе правильно их выпилили.
          Ответить
          • Ещё бы человеческую инкапсуляцию сделали. Чтобы все поля можно было отдельно от интерфейса описывать, внутри цппшки. Там же, вроде, достаточно было бы размер класса как символ экспортнуть, чтобы линкер мог его протащить в другие модули...

            Задолбали эти классы кишками наружу, из-за которых приходится делать pimpl или интерфейсы...
            Ответить
            • Кстати, что там в модулях? Я за ними не следил, но вроде они как раз должны были решить подобные проблемы.
              Ответить
          • > Пишу две функции, прячу константы в .cpp-файле.

            К слову. Какой эклипсов рефакторинг уже способен функцию между .h/.cc перемещать произвольно?
            Ответить
            • В жаве чуть ли не мышью можно.
              Ответить
            • > Какой эклипсов рефакторинг уже способен функцию между .h/.cc перемещать произвольно?

              C-x C-v ?
              Ответить
              • Нет. Тоглить где/как метод определен: внутри класса, или за пределами класса.

                В luna что у меня на бубунте стоит для этого ничего в refactoring меню не наблюдается.

                В тяжелые времена я даже перлов скипт 2-5 строчник писал, которые из тела класса определения методов выдирал и в сырец записывал. Было не идеально, и надо было руками (ок, vim'ом) допиливать, но мне это было надо на 50+ методов и где-то на 10ом я уже затрахался это в ручную делать.
                Ответить
                • > внутри класса, или за пределами класса

                  Но ведь это связано с .h/.cpp файлами очень косвенно. Я в хедер-онли либах, к примеру, часто выношу тела методов за пределы класса, но они живут не в .cpp файле.

                  В общем, похоже на это
                  Refactor > Toggle Function Definition
                  
                  http://help.eclipse.org/neon/index.jsp?topic=%2Forg.eclipse.cdt.doc.user%2Ftasks%2Fcdt_t_toggle.htm
                  Ответить
                  • дока говорит что в луна тоже должно быть. может быть не там курсор стоял. завтра попробую.
                    Ответить
        • да ладно вам. Дефолтное значение это зачастую еще и подсказка валидного ввода с несколько иным поведением функции
          Ответить
    • ███████                                                                                                                         
      ██   ██                                                                                                                         
      ██   ██                                                                                                                         
      ██   ██  █████     ████ ██   ██ ██████  █████  ██████  ████        ██   ██  █████       ██   ██ ██   ██ ██ █ ██ ██   ██  ████   
      ██   ██ ██   ██   ██ ██ ██   ██ █ ██ █ ██   ██ █ ██ █     ██       ██   ██ ██   ██      ██   ██ ██   ██ ██ █ ██ ██   ██     ██  
      ██   ██ ██   ██  ██  ██ ██  ███   ██   ██   ██   ██    █████       ██   ██ ██   ██      ██   ██ ██   ██  █ █ █  ██   ██  █████  
      ██   ██ ██   ██  ██  ██ ██ █ ██   ██   ██   ██   ██   ██  ██       ███████ ███████      ███████ ██   ██  █████  ███████ ██  ██  
      ██   ██ ██   ██  ██  ██ ███  ██   ██   ██   ██   ██   ██  ██       ██   ██ ██           ██   ██ ██   ██  █ █ █  ██   ██ ██  ██  
      ██   ██ ██   ██  ██  ██ ██   ██   ██   ██   ██   ██   ██  ██       ██   ██ ██   ██      ██   ██  ██████ ██ █ ██ ██   ██ ██  ██  
      ██   ██  █████  ███  ██ ██   ██  ████   █████   ████   ███ ██      ██   ██  █████       ██   ██      ██ ██ █ ██ ██   ██  ███ ██ 
                                                                                                           ██                         
                                                                                                      ██   ██                         
                                                                                                       █████
      Ответить
    • ███████                                                                                                                         
      ██   ██                                                                                                                         
      ██   ██                                                                                                                         
      ██   ██  █████     ████ ██   ██ ██████  █████  ██████  ████        ██   ██  █████       ██   ██ ██   ██ ██ █ ██ ██   ██  ████   
      ██   ██ ██   ██   ██ ██ ██   ██ █ ██ █ ██   ██ █ ██ █     ██       ██   ██ ██   ██      ██   ██ ██   ██ ██ █ ██ ██   ██     ██  
      ██   ██ ██   ██  ██  ██ ██  ███   ██   ██   ██   ██    █████       ██   ██ ██   ██      ██   ██ ██   ██  █ █ █  ██   ██  █████  
      ██   ██ ██   ██  ██  ██ ██ █ ██   ██   ██   ██   ██   ██  ██       ███████ ███████      ███████ ██   ██  █████  ███████ ██  ██  
      ██   ██ ██   ██  ██  ██ ███  ██   ██   ██   ██   ██   ██  ██       ██   ██ ██           ██   ██ ██   ██  █ █ █  ██   ██ ██  ██  
      ██   ██ ██   ██  ██  ██ ██   ██   ██   ██   ██   ██   ██  ██       ██   ██ ██   ██      ██   ██  ██████ ██ █ ██ ██   ██ ██  ██  
      ██   ██  █████  ███  ██ ██   ██  ████   █████   ████   ███ ██      ██   ██  █████       ██   ██      ██ ██ █ ██ ██   ██  ███ ██ 
                                                                                                           ██                         
                                                                                                      ██   ██                         
                                                                                                       █████
      Ответить
    • ███████                                                                                                                         
      ██   ██                                                                                                                         
      ██   ██                                                                                                                         
      ██   ██  █████     ████ ██   ██ ██████  █████  ██████  ████        ██   ██  █████       ██   ██ ██   ██ ██ █ ██ ██   ██  ████   
      ██   ██ ██   ██   ██ ██ ██   ██ █ ██ █ ██   ██ █ ██ █     ██       ██   ██ ██   ██      ██   ██ ██   ██ ██ █ ██ ██   ██     ██  
      ██   ██ ██   ██  ██  ██ ██  ███   ██   ██   ██   ██    █████       ██   ██ ██   ██      ██   ██ ██   ██  █ █ █  ██   ██  █████  
      ██   ██ ██   ██  ██  ██ ██ █ ██   ██   ██   ██   ██   ██  ██       ███████ ███████      ███████ ██   ██  █████  ███████ ██  ██  
      ██   ██ ██   ██  ██  ██ ███  ██   ██   ██   ██   ██   ██  ██       ██   ██ ██           ██   ██ ██   ██  █ █ █  ██   ██ ██  ██  
      ██   ██ ██   ██  ██  ██ ██   ██   ██   ██   ██   ██   ██  ██       ██   ██ ██   ██      ██   ██  ██████ ██ █ ██ ██   ██ ██  ██  
      ██   ██  █████  ███  ██ ██   ██  ████   █████   ████   ███ ██      ██   ██  █████       ██   ██      ██ ██ █ ██ ██   ██  ███ ██ 
                                                                                                           ██                         
                                                                                                      ██   ██                         
                                                                                                       █████
      Ответить

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