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

    +3

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    T& T::operator =(const T& that)
    {
        delete[] Name;
        Name = that.Name ? strcpy(new char[strlen(that.Name) + 1], that.Name) : 0;
        return *this;
    }

    плюсы без плюсов

    Запостил: absolut, 09 Октября 2015

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

    • стыдно признаться, но я тоже иногда что-то подобное делаю :(
      Ответить
      • https://i.imgur.com/IqtkAdC.png
        Ответить
      • весьма унылая ситуация, полная иронии.

        несколько раз в С++ приходилось `std::string` в `char*` переводить потому что динамическая память ставила все на колени, и ее с std::string никак не избежать.

        но и несколько раз С проекты на С++ перетаскивал, только для того что бы с помощью std::string обработку строк хотя бы кое как в человеческий вид привести.
        Ответить
        • забыл уточнить, что подобный код я пишу чисто для себя, его никто не увидит, и в обычных условиях моего домашнего ноутбука он прекрасно работает. На работе code reviewers конечно же такое не пропустят (и правильно сделают)
          Ответить
          • И зачем дома гадить, хоть и в код?
            По ГК могу добавить, что имеем проёб строки, если присваиваем самому себе. Ну, и будь член Name нормальной std:: строкой писать оператор присваивания, а равно как и копиконструктор с деструктором, надобности бы не возникло.
            Меньше кода - меньше багов.
            Ответить
            • Если честно, то просто лень заморачиваться, в чистом виде со строками мне редко приходится работать, они скорее часть какой-нибудь структуры, и размер строки заранее задан и известен
              Ответить
            • > Меньше кода - меньше багов.

              я когда под пивом дома пишу, ведущий принцип это "меньше думаешь - меньше думаешь."
              Ответить
        • Избежать можно, прикрутив свой аллокатор
          Ответить
          • неужели в свежих версиях крестов что-то сделали что бы в stl с кастом аллокаторами было проще работать? в прошлом были кучи мелких неприятных граблей, и кучи мудачества около, потому что даже `a = b;` больше не компилится (где a &b это тот же самый stl класс, но с разными аллокаторами).
            Ответить
            • Классы, построенные по одному шаблону, но с разными параметрами - это разные классы. Если нет соответствующего шаблонного же оператора присваивания, то ничего не получится.
              Ответить
              • > то ничего не получится.

                в этом как бы и был вопрос.

                судя по списку конструкторов - http://www.cplusplus.com/reference/string/basic_string/basic_string/ - ничего не изменилось, и присвоение все еще надо делать с помощью `a.assign( b.begin(), b.end() );` или подобного.

                я на одном проекте пытался с альтернативным алокатором работать, но вот из-за таких граблей это было просто непрактично.
                Ответить
                • Про кросс-аллокаторное присваивание гуглится basic_string_ref (http://goo.gl/JhUjq9)
                  В Стандарте нет, но есть в бусте.
                  Ответить
                  • > basic_string_ref (http://goo.gl/JhUjq9)
                    > > What you need is an intermediate type that is implicitly constructable from both std::string and your allocator string.

                    блин, но это же для каждого stl'ного класса надо делать.

                    читая дальше:

                    > http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3334.html#classstd_1_1basic__string__re f
                    > > It is expected that user-defined string-like types will define an implicit conversion to string_ref (or another appropriate instance of basic_string_ref) to interoperate with functions that need to read strings.

                    это совсем для других целей народ делает.

                    вообщем проще пока не заморачиватся.
                    Ответить
          • > свой аллокатор
            Можно ещё замутить small string optimization, правда, придётся велосипедить строку. Или брать какой-нибудь fbstring
            https://github.com/facebook/folly/blob/master/folly/docs/FBString.md
            Ответить
    • > плюсы без плюсов

      называются кресты. С××!
      Ответить

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