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

    +1

    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
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    class SumClass
    {
      int A, B;
      public:
      void Set_A(int A) {this->A = A;}
      void Set_B(int B) {this->B = B;}
    
      int Sum() {return A+B;}
    }
    
    class MultiSumClass
    {
      SumClass Sum;
      int count;
      public:
      void Set_A(int A) {Sum.Set_A(A);}
      void Set_B(int B) {Sum.Set_B(B);}
      void Set_Count(int count) {this->count = count;}
      
      int GetSum() {return Sum->Sum()*count;}
    }
    
    void main()
    {
       MultiSumClass MSC;
       MSC.Set_A(5); MSC.Set_B(10);
       MSC.Set_Count(2);
       cout << MSC.GetSum();
    }

    Вот зачем ООП нужно
    http://www.gamedev.ru/flame/forum/?id=164035

    извените за игрстрй

    Запостил: TarasB, 02 Июля 2012

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

    • [trollmode on]А почему MultiSumClass не унаследован от SumClass? Почему main void? Где const у методов Sum() и GetSum(). Куда делись геттеры? Где, наконец, конструктор с инициализацией членов...[trollmode off]

      http://ideone.com/MBMeo
      Ответить
      • показать все, что скрытоСдался вам этот возвращающий маин - какая с него польза?
        Ответить
        • Ваша фраза выдаёт человека, не использующего командный интерпретатор.
          Ответить
          • Ну если человек всю жизнь писал только гуёвые проги, которые запускают с ярлычка на рабочем столе\в пуске, то ему, скорее всего, код возврата и не нужен был...
            Ответить
            • У меня билд долгий скриптом из bash запускается, который при завершении через notify-send либо радостное сообщение посылает, либо печальное, в зависимости от кода возврата билд-тулы.
              Ответить
              • Ну это вы... Но если пользоваться только IDE, то, при отсутствии проблем, можно так и не узнать какие параметры передаются компилятору, и что он возвращает.
                Ответить
                • Если билд идёт 10-15 минут, мне не хочется залипнуть на какой-нибудь интересной хрени слишком долго :)
                  В этом плане IDE не помощник
                  Ответить
              • вот мне нравится троллинг тогда еще Sun'а:

                там точка входа public static void main(String[] args),
                код завершения можно передать только через System.exit(code);
                и в то же время завершение проги через System.exit() считается дурным тоном (не рекомендуется), т.к. безусловно убивает всю VM без завершения всяких там финализаторов и проч.
                плюс еще security manager может это дело запретить.

                trollface.jpg
                Ответить
                • > security manager может это дело запретить
                  Выхода нет...
                  Ответить
                  • это запрещено, например, в апплетах. иначе бы, скажем, заходит юзверь на страничку с апплетом, и тут у него грохается его любимый ослик\опера\лиса\хромой\что-то еще...
                    Ответить
                    • Хм. Ну смотря как исполняется апплет. Если в том же процессе, что и браузер - то да, exit закончится печально. А если в отдельном - то пофиг.
                      Ответить
                      • ну или апплет (а может, и апплеты с других страниц) грохаются.
                        Ответить
        • Открываем стандарт с++98, пункт 3.6.1.2.
          "It shall have a return type of type int, but otherwise its type is implementation-defined. All implementations shall allow both of the following definitions of main:
          int main() { /* ... */ }
          and
          int main(int argc, char * argv[]) { /* ... */ }".

          Еще вопросы есть?
          Ответить
          • показать все, что скрытоДа кто, когда кодит строго по стандарту? Вы ему тоже строго следуете?
            Ответить
            • Стараюсь, насколько могу. Мне вот не сложно написать int и return вместо void один раз за все время разработки проекта...

              P.S. Ну и в g++ void main() тупо не компилится. Так что вариантов у меня особо нет.
              Ответить
              • P.P.S. Из сознательных отклонений от стандарта было пожалуй только использование gcc'шных attribute(constructor/destructor) на С. А бессознательные отклонения стараюсь устранять по мере того, как узнаю о них.

                Чем меньше вы пользуетесь "фишками" (читай выебонами) текущей платформы - тем больше вероятность того, что этот код будет собираться другим компилятором, или тем же самым через несколько лет.

                Чем меньше вы пользуетесь недокументированными возможностями (читай багофичами) - тем больше вероятность того, что ваш код будет работать после очередного обновления операционки или каких-либо библиотек.
                Ответить
              • >тупо не компилится. Так что вариантов у меня особо нет.
                Лол. Так можно довыебываться до того что когда приспичит срочно портировать код - будет страшный процесс дрочева "шоб оно компилилось", вместо того чтобы не особо напрягаясь приучиться писать нормально.
                Ответить
                • Это была приписка для тех, кто не понимает нужности стандартов, и уже готовится ответить на первое предложение "Ты хуй! void же писать быстрее чем int и return, и в моей визуалстудии все пашет." ;)
                  Ответить
            • void писать дольше, чем int. Уже экономия.
              Был бы в этом хоть какой-то сакральный смысл.
              Ответить
              • > Был бы в этом хоть какой-то сакральный смысл.
                Борьба с системой же!

                UPD: Но к int надо еще и return
                Ответить
                • >UPD: Но к int надо еще и return

                  В main можно опустить return - это эквивалентно return 0
                  Ответить
                  • > В main можно опустить return
                    Да я в курсе... просто не понимаю, зачем они сделали этот дурацкий частный случай. Поэтому я всегда пишу return в main(). Если приведете веские аргументы в пользу его неписания - может быть и перестану ;)
                    Ответить
                    • Если программа не подразумевает кода возврата, то и return вроде как не нужен. Например, гуёвина на GTK+:
                      int main(int argc, char **argv)
                      {
                        gtk_init (&argc, &argv); //returns void
                        gtk_main (); //returns void
                      }

                      а ещё экономия места на диске
                      Ответить
                      • Ну, я понимаю, что так можно писать, вон ниже даже приведена выписка об этом из стандарта, но до меня не доходит зачем было делать для main исключение из правила "функция с типом отличным от void должна возвращать значение".

                        Имхо, глупо делать исключения на ровном месте ради сомнительной экономии одной строчки на проект. Причем в С89 такой код вызывает UB, но тем не менее компилируется (с ворнингом), а во всех дальнейших с\с++ подразумевается return 0.
                        Ответить
                        • не секрет, что комитеты по С и С++ хотят не только красиво в меру своих сил, но и угодить армии производителей компиляторов
                          думаю, накопилось достаточно кода, написанного для какого то лояльного компилятора, позволяющего ничего не возвращать из main - вот и легализовали это на бумаге
                          к слову, в С99 есть аналогичный пункт про отсутствие return, а в С11 вообще намекают на то, что main может возвращать incompartible with int

                          зы в С++11 тоже есть намек на отличие вовращаемого типа от int - традиционно implementation defined
                          Ответить
                          • В принципе, вполне логичный ход с их стороны. Теперь говно, пользовавшееся этим UB, хотя бы работает согласно стандарту.

                            Если гора не идет к Магомету...
                            Ответить
                          • Комитет по C++ хочет угодить производителям компиляторов?

                            Преобразовали бы язык что-ли, дабы он леворекурсивным парсером нормально обрабатывался.
                            Ответить
                  • Это точно так?
                    Ответить
                    • С++98 Пункт 3.6.1.5.

                      A return statement in main has the effect of leaving the main function (destroying any objects with auto-
                      matic storage duration) and calling exit with the return value as the argument. If control reaches the end
                      of main without encountering a return statement, the effect is that of executing
                      return 0;
                      Ответить
            • Кстати приведу несколько примеров, когда разработчики не следовали стандартам и манам:

              1) Старые программы, которые вместо #include <errno.h> писали extern int errno... "Зачем инклудить какую-то херню ради одной переменной?", думали программисты, и получили хуем в лоб, когда в libc появилась поддержка тредов.

              2) Куча софта, использующего memcpy вместо memmove потому что оно работает... Все это поломалось на очередном обновлении libc, в котором memcpy решили сделать более шустрым.

              3) Тот же MySQL с его кастом инта в велосипедный бул размером в чар... Кого ебёт то, что memcmp возвращает int а не char? Да никого, потому, что до некоторых пор все сравнивалось побайтно и результат, по счастливой случайности, не вылезал за пределы чара.

              Вот из-за таких как вы, забивающих на стандарты, и любящих пользоваться UB и недокументированными фишечками, и случаются все эти проблемы, которых могло бы и не быть. А фиксить эти проблемы приходится не вам, а авторам компиляторов, и библиотек, оставляя костыли и теряя возможность сделать более вменяемые или быстрые реализации.
              Ответить
              • А вас не интерисует что кроме стандартов и этикета существует суровая реальная жизнь? Типснтриксы и не соответствия стандартам появляются не от хорошей жизни (хоть это никак и неоправдывает быдлокодеров) - часто приходится вбрасывать новый функционал в проект написанный не тобой, а потом выясняется, что это крепко конфликтует с архитектурой, на перереботку ее денег никто не даст - делай как знаеш, вот и приходится гланды через зад удалять и на стандарты ложить болт и недокументированные возможности привлекать. Самому иной раз не нравится, а что делать.
                Ответить
                • > А вас не интерисует что кроме стандартов и этикета существует суровая реальная жизнь?
                  Конечно интересует. И, я согласен, что иногда нужно положить болт на стандарты, и сделать чтобы работало. Но не надо делать из раскладывания болтов смысл жизни, и писать хуйню (читай void main() в с++) тогда, когда все прекрасно работало бы и по стандарту.
                  Ответить
                  • Я готов простить такую хуйню, если приложение будет нормально спроектированно, а код откоментирован, а цепляться к тому к чему вы после решения задач типа [сарказм]Отреж пипиську из промежности и пришей на лоб! Ой, а почему на этом теле пипиську можно отрезать только на пару с ногами?[/сарказм] както не весело.
                    Ответить
                    • > Я готов простить такую хуйню, если приложение будет нормально спроектированно, а код откоментирован
                      Да ради бога! В таких случаях и я с радостью прощу автора.

                      Но проблема в том, что опытный разработчик, который умеет нормально проектировать, как правило и не позволит себе, без веской на то причины, отклоняться от стандарта и документированных возможностей...
                      Ответить
                    • Нельзя без ВЕСКОЙ причины нарушать стандарты.
                      Ответить
                • Я думаю, всё же стоит различать архитектуру вашего приложения и стандарт языка. Кроме того, использование расширений языка там, где без них сложно (и то без них почти всегда можно обойтись) - не тоже самое, что нарушение, как правило, несложных правил.
                  > знаеш
                  ведь не так уж сложно не нарушать стандарты русского, например.
                  Ответить
              • 4) Microsoft Internet Exporer
                Q.E.D.
                Ответить
    • >int Sum() {return A+B;}
      ололо lazy evaluation
      Ответить
    • "Вытащили что-то из носа и размазали по бумаге"(с)
      Ответить
    • Сделать конструктор с передачей A, B и перегрузить оператор ().

      cout << MultiSumClass(1,2,3)();
      Ответить
      • мсье знает толк в извращениях
        Ответить
      • > Сделать конструктор с передачей A, B и перегрузить оператор ().
        Ну тогда уж сделать конструктор, с передачей A, B и оператор int().

        http://ideone.com/auqwp
        Ответить
        • Толково, но вот в чём выражается "ленивость" такого сложения?
          Вот ленивое умножение я могу себе представить: если первый операнд 0, второй вычислять не нужно.
          А ленивое сложение... Может чего-то не знаю, поясните пожалуйста.
          Ответить
          • А вот:
            LazySum x(1, 2); // тут сложения еще не было
            ...
            std::cout << x << std::endl; // а вот тут оно и произойдет

            Т.е. сложение будет выполнено только тогда, когда понадобится его результат.
            Ответить
    • >извените
      >игрстрй
      Ответить
    • Кстати по-поводу SumClass:

      ExceptionClass { ... };
      printfFunction( ... );
      ColorEnum { clBlack... };
      xDouble = 0.1;
      yString = "...";

      И финал:
      template <...> class vectorTemplateClass { };

      template <...> void compareTemplateFunction( ... );
      Ответить
      • И кстати у функции же тип аргументов надо не забыть!

        compareTemplateFunctionResultBoolArment1 AnyArgument2Any

        ... кстати выше bool а не void как результат.
        Ответить

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