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

    +23

    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
    const Tifon& Tifon::operator=(const Tifon& Buffer)
    {
            assert(&Buffer!=this);
            if(&Buffer==this)
                    return *this;
            Tifon OldForExceptionSafe(*this);
            try{
                    this->~Tifon();
                    ::new((void*)this)Tifon(Buffer);
            }catch(...){//try restore
                    ::new((void*)this)Tifon(OldForExceptionSafe);
            }
            return *this;
    };
     //...
    namespace std
    {
            const Tifon&swap (Tifon& a, Tifon& b) {
            assert(&a!=&b);
            if(&a==&b)
                    return a;
            Tifon c(a);
            a=b;
            b=c;
            }
    };

    Запостил: USB, 22 Июля 2012

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

    • Начальник говорит, что я написал говно. Я пытаюсь доказать, что я не пишу говно и запостил суда, чтобы проверить это утверждение.
      Ответить
      • несмотря на то, что начальник всегда прав, тут он на самом деле прав
        что ты хотел сэкономить? реализацию assign?
        тут на мой взгляд оператор = такой тривиальный, что можно было его совсем не писать - компилятор сам его создаст
        а так у тебя лишняя аллокация, ручной вызов деструктора, инплейс конструктор... даже ; после },
        + взаимоисключающие assert и проверки - ты уж остановись на чем то одном
        Ответить
        • показать все, что скрыто>тут на мой взгляд оператор = такой тривиальный, что можно было его совсем не писать - компилятор сам его создаст

          Он деструктор старого объекта вызовет перед конструированием? Или это будет голое копирование бинарных данных? Не пойдет, так как там в этом классе ссылки даже на члены в себе есть.


          >несмотря на то, что начальник всегда прав

          Он всегда не прав, я считаю. Но молчу.


          > у тебя лишняя аллокация

          Лолшто? Это вызов конструктора.
          Ответить
          • лолшто?
            Tifon OldForExceptionSafe(*this);
            это не вызов конструктора, это создание временного ненужного объекта

            > ссылки даже на члены в себе
            говнокодище

            > голое копирование бинарных данных
            иди читай что происходит по умолчанию в копирующем конструкторе и операторе присваивания

            и да, заодно почитай про ADL и надо ли объявлять swap в namespace std
            Ответить
            • >иди читай что происходит по умолчанию в копирующем конструкторе и операторе присваивания
              >и да, заодно почитай про ADL и надо ли объявлять swap в namespace std

              Можно ссылку? Ну пожалуста. =)
              Ответить
              • ссылку на что?
                на то, что в копирующем конструкторе будут вызваны копирующие конструкторы соответствующих членов? стандарт раздел 12

                а вот тебе пример верного объявления swap
                http://ideone.com/44HbH
                Ответить
                • то есть если есть T(), T(const T&) и ~T(), то можно не перегружать =?
                  Ответить
                  • нет
                    тривиальный метод (конструктор, оператор =) - метод, который создастся компилятором

                    если все члены класса умеют своими копирующими конструкторами инициализировать себя, копирующий конструктор класса не нужен, т.к. хватает логики тривиального
                    если все члены класса умеют своими операторами = присваивать себя, оператор присваивания класса не нужен, т.к. хватает логики тривиального

                    проблемы начинаются, если делать внутри класса ссылки на члены класса, либо если пользоваться кучей без резинки (голые new, delete ...)
                    в жизни в большинстве этих редких случаев решает единственный метод assign, который напрямую используется в теле operator = и в теле конструктора копирования (если не смущает двойная инициализация - сначала дефолтная, а потом уже реальная)

                    а деструктор вообще ортогонален - он в тривиальном операторе = () не должен участвовать
                    Ответить
                    • Я хочу, чтобы у меня был std::shared_ref, но кресты в очередной раз подсасывают. Зато дела с этим в нормальных языках идут нормально.
                      Ответить
                      • ссылка - синтаксический сахар над указателем
                        может не стоит удалять больной зуб ректально?
                        повышение энтропии приводит к коду, который невозможно поддерживать
                        Ответить
                        • Ссылка - скрытый указатель. Это Ъ
                          Ответить
                    • Вот если использовать указатели на члены, то все нормально и голое копирование пройдет нормально. А вот ссылки на члены кен нот инто голое копирование.
                      Ответить
                    • А, я понял, делают как в Аде, (добавляют один метод "подгонка"), только операторы все пишутся руками (а в Аде автоматом).
                      Ответить
                • >http://ideone.com/44HbH
                  А, мои глаза... Что это? Как?
                  Ответить
                  • Сначала взялся свап из какогото левого не подключенного неймспейса... о_О
                    Ответить
                • Это из-за ADL? А ещё какие сурпризы меня из-за него ждут? Вот так после такого я даже перестану верить в деда мороза...
                  Ответить
                  • да, это работа ADL
                    благодаря ему ты можешь перегружать operator << (std::ostream &, ...), например, который будет работать
                    Ответить
                    • Это какието крестопроблемы. Глобально определил оператор и только после этого чтобы он искался, а не из какогото левого неподключенного неймспейса.
                      Ответить
                      • с++03
                        насчет запиливания swap
                        17.4.3.1 Reserved names.
                        1) It is undefined for a C++ program to add declarations or definitions to namespace std or namespaces within namespace std unless otherwise specified. A program may add template specializations for any standard library template to namespace std. Such a specialization (complete or partial) of a standard library template results in undefined behavior unless the declaration depends on a user-defined name of external linkage and unless the specialization meets the standard library requirements for the original template.
                        т.е. ты имеешь право, но только в случае
                        namespace std {
                            template <>
                            void swap<my::sifon>(my::sifon & sifon, my::sifon & boroda) { ... }
                        }
                        ну а без adl у тебя не срастался бы никогда поиск корректного оператора http://ideone.com/9dN1e
                        Ответить
        • >взаимоисключающие assert и проверки - ты уж остановись на чем то одном
          ассерт работает только в дебаге, так что нужны проверки. компания Гугл по кодестайлу всегда настаивает исправить ситуацию возможного провала ассерта в релзе.
          Ответить
        • >даже ; после }
          Ты где это углядел? Похоже ты меня троллешь.
          Ответить
        • тут }; только после структур и пространств имён, а там без ; нельзя,
          Ответить
          • 14 строка не?
            Ответить
          • в смысле после пространств имён нельзя без ;?
            Ответить
            • у меня не компилировалось
              а вообще нахуй забивать голову правилом, где нужно ставить, а где можно не ставить, если можно просто везде ставить?
              Ответить
              • ставить нужно только после определения тела класса/структуры
                обсуждалось уже

                потому что компилятор должен как-то отличать
                struct some { body };
                struct some { body } var;
                Ответить
                • Второе объявление ненужно, лучше сразу структуру отдельно именем назвать и проблем меньше будет.
                  Ответить
                  • есть unnamed структуры, они оговорены стандартом, даже с89
                    ты можешь сделать http://ideone.com/KykAM
                    Ответить
                    • Да я знаю, что есть, да нахуй они нужны
                      Ответить
                      • и это говорит человек, который так плачется о невозможности локальных функций в с++
                        Ответить
                        • локальные функции нужны, онанимные структуры - нет, придумать имя ничего сложного нет, а вот глобализовывать функцию - это убого
                          Ответить
                          • выдержка из сишного стандарта
                            EXAMPLE 1 The following illustrates anonymous structures and unions:
                            struct v {
                                union { // anonymous union
                                    struct { int i, j; }; // anonymous structure
                                    struct { long k, l; } w;
                                };
                                int m;
                            } v1;
                            v1.i = 2; // valid
                            v1.k = 3; // invalid: inner structure is not anonymous
                            v1.w.k = 5; // valid

                            это фича языка, которая не сочетается с "ничего сложного придумать имя"

                            и как бы дельфинам не нравилось "крестоблядство!!11 если запомнить однобитное правило когда ставить точку с запятой после закрывающей скобки, у меня не хватит времени программировать мышкой", это таки придется освоить
                            как и то, что перед else тоже идёт statement (а не как в паскале, везде ставим точку с запятой, а перед ним не ставим)

                            я смотрю тут тред добра, хейтеры расставили мне минусы, а тарасу - плюсы, кто бы говорил про виртуалов
                            Ответить
                            • С точкозапятой вообще всё просто.
                              В Паскале ";" - разделитель.
                              В Си ";" - терминатор
                              Ответить
                              • >терминатор
                                Шварц?
                                Ответить
                                • >Шварц?
                                  черный
                                  Ответить
                                  • Двойной черный, скоро капучино.
                                    Ответить
                                    • Это напомнило мне как в одном говнофильме (Сокровище нации, вроде) Николас Кейдж искал подсказки и отгадывал всякие головоломки как ему найти это сокровище.

                                      Типа "конфеты - сладкое, сладкие конфеты дарят на Рождество, Рождество - холодно, где холодно - на Северном полюсе.
                                      Поцоны айда на Северный полюс!!!"
                                      Ответить
                                      • "Поцоны айда на Северный полюс - А мы уйдём на север, а мы уйдём на север - Ну и хуй с вами я спать "
                                        Ответить
                            • Этот пример онанимной структуры тоже не нужен при нормальной реализации вариантных структур, см Паскаль.
                              Я в этой теме виртуалов не применял и тебе минусы не ставил.
                              Ответить
                              • А как Вы, многоуважаемый, относитесь к совмещению имён?
                                Ответить
                                • Паскаль не даёт в разных ветках писать одинаковые имена.
                                  Как ведёт себя сишка, не знаю.
                                  Ответить
                              • нормальная реализация - это там где надо писать case integer of 0: 1: 2:?

                                прокомментируй, пожалуйста, результат паскалевской киллир-фичи "tagged variant record" http://ideone.com/nr9m1 - она же сама должна проверять, к какому полю я имею право обращаться, а к какому нет

                                или вот еще fpc, не то, что крестоговно - отличный образчик надежного компилятора, построенного по утвержденному международному стандарту: http://ideone.com/IjNdV
                                Ответить
                                • >tagged variant record" http://ideone.com/nr9m1

                                  Лол, ты тугой штоле? Это не tagged variant record.


                                  Пользователь USB получает предупреждение, за нарушение правила 2.2.1 данного сайта.
                                  Ответить
                                  • Эээ? Что-за фигня? Правил у нас никаких нет. Не балуйся с моими постами.


                                    Пользователь USB получает бан до 25.07.2012, за обсуждения действий модератора.
                                    Ответить
                                  • а что это?
                                    http://en.wikipedia.org/wiki/Tagged_union#1970s_.26_1980s
                                    http://en.wikipedia.org/wiki/Comparison_of_Pascal_and_C#Record_types
                                    Ответить
                                • А я где-то говорил, что Паскаль проверяет tagged union? Да, ещё он не даёт строки и динмассивы пихать в такие структуры, угадай почему.
                                  Приводя пример надёжных проверяемых tagged unions, позволяющих запихивать неподы в ветки и с корректным поведением неподов, я всегда говорил про Аду.
                                  Ответить
                            • > я смотрю тут тред добра
                              Я исправляю ситуацию по мере сил, но их не хватает.
                              Ответить
                            • Тараса все любят!

                              Есть ещё версия, что Тарас локаничен и короток в своих ответах вроде:
                              > ты хуй
                              а вы постоянно цитируете стандарт, @defecate++, а бывает и на буржуйском наречии, что минурастов приводит в ступор, заставляя активно минусовать.
                              Ответить
                      • ...anonymous struct seem less useful than anonymous unions. It's not exactly an indispensable feature that will make your code look nicer or run faster. However, it is useful in applications that use machine-generated code. For example, an anonymous struct can map directly to a remote database record. Similarly, it could be useful when the name of the struct is dynamic and changes with every database transaction. More importantly, as trivial as it may seem, an anonymous struct is a feature you might stumble upon every now and then. Now you'll know what it looks like.
                        Ответить
                        • Короче говоря - "вы можете встретить их в определенных случаях, но сами по доброй воле писать не будете".
                          Ответить
      • Вспомни про психа которому нужно будет читать этот код.

        И да, он знает где ты живешь.
        Ответить
        • Никто из тех с кем я работаю лично - не знает моего настоящего адреса проживания. :)
          Ответить
          • А ты с ним не работаешь лично. Он просто читает твой код, у него приступы ярости от плохого кода и он знает где ты живешь.

            И НЕ ЗЛИ МЕНЯ БОЛЬШЕ!!!
            Ответить
            • >И НЕ ЗЛИ МЕНЯ БОЛЬШЕ!!!
              Хомячков злить не опасно.

              >и он знает где ты живешь.
              и он не знает где я живу!
              Ответить
      • > Я пытаюсь доказать, что я не пишу говно
        У меня для вас плохие новости. (с)
        Ответить
      • То, про что тут пока не написали:

        > namespace std { ... }
        Зачем срешь не в свой неймспейс?

        > const Tifon&swap (Tifon& a, Tifon& b) {
        Зачем swap возвращает значение?

        > }catch(...){//try restore
        Что там за конструктор копирования такой, что надо обрабатывать брошенные из него исключения? И самое забавное - ну вот выкинул тот конструктор исключение, присваивание откатило объект обратно, вся логика алгоритмов, выполняемых над этим классом пошла под откос. Нахуй так жить...

        Начальник прав. Код полное говно.
        Ответить
        • И да, что там за проект такой?
          https://ru.wikipedia.org/wiki/Тифон
          Ответить
          • http://ru.wikipedia.org/wiki/Тифон_(боевая_информационно-управляющая_система)
            Тогда уж. Раз такая надежность нужна.
            Ответить
            • Черд, меня почти раскрыли. А вот не буду я это показывать начальнику... Как говнокод удалить?
              Ответить
              • Смывать надо.(с)
                Ответить
              • >Как говнокод удалить?

                Найти инъекцию и выполнить
                DELETE FROM `govnotable` WHERE id = 11458;
                Ответить
              • Поздно. Тред скопирован на wikileaks.
                Ответить
                • показать все, что скрытоНу о говнокоде.сру мой начальник не знает. А вы не знаете кто мой начальник. От меня он об этом фейле никогда не узнает. Чувствуйте себя беспомощными. Я останусь безнаказанным. И да, я прав, а начальник не прав.
                  Ответить
                  • Не парься, братюнь.

                    Хочешь пирожок?
                    Ответить
                  • Гумно, залогинься.
                    Ответить
                  • > Ну о говнокоде.сру мой начальник не знает. А вы не знаете кто мой начальник. От меня он об этом фейле никогда не узнает. Чувствуйте себя беспомощными. Я останусь безнаказанным.

                    Всю жизнь ты будешь скрываться, и бояться что инфа о тебе проскочит в интернет... Будешь по 10 раз перепроверять каждое отправляемое сообщение... По ночам ты не сможешь спать, просыпаясь от страшных снов, про то как ГК узнал кто ты и рассказал начальнику... Совесть будет грызть тебя. И, став 80летним параноиком ты придешь к начальнику, и все ему расскажешь.
                    Ответить
                    • Превосходно! Превосходно!

                      Присылайте и дальше нам свои работы.
                      Ответить
                  • >USB-Здесь все - Никита, Стас, Гена ,Турбо и Дюша Метёлкин
                    ну и нахуй вы нам тут не нужны
                    Ответить
                    • > Никита, Стас, Гена ,Турбо и Дюша Метёлкин
                      Кто все эти люди?
                      Ответить
                      • http://www.youtube.com/watch?v=1F-CD-8mQeI
                        Ответить
                      • Блаженны те, кому не знаком контент канала ТНТ.
                        Ответить
                        • Аминь
                          Ответить
                          • Брамс хотел включить эту часть в свой реквием под номером восемь, ведь она бы отлично дополняла "Блаженны плачущие..." и "Блаженны мёртвые...", но в последний момент передумал.
                            Ответить
    • Код - говно, автор - латентный копрофил.
      Ответить

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