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

    +998

    1. 1
    2. 2
    3. 3
    bool Buffer::ReadData(const QByteArray &array){
        return this->ReadData((char*)array.constData(), array.size());
    }

    Без комментариев
    0_o

    Запостил: ir4y, 06 Февраля 2012

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

    • 1. this-> - ну это на любителя - я бы не писал.
      2. char* и ByteArray
      3. вопрос еще, что readdata(char*, int) делает.
      Ответить
      • ну ReadData - очевидно, пытается прочитать size_t байт в область памяти char *, доступную к записи
        но array - константный, даже метод constData какбе намекает
        Ответить
        • да, действительно.
          честно говоря, я бы назвал ReadFromBuffer, чтобы даже в конце рабочего дня у нового разработчика не возник вопрос: "Откуда и куда читается?"
          Ответить
      • bool ReadData(char *array,uint count);

        Читает данные в array, количеством не более count,
        в случае успеха возвращает true
        в случае ошибки false
        Ответить
        • кстати, плохой интерфейс
          неплохо бы возвращать сколько на самом деле было прочитано
          Ответить
      • Мне кажется что при обращении к методам класса надо явно указывать что это метод класса.
        Иначе непонятно где методы, а где функции не из класса.
        Ответить
        • все же ты пишешь на С++, и отдельно висящие функции (даже как static в .cpp файле) нечасты - поэтому обычно понятно, где методы, кроме того, вот такие вот функции обычно прячут в namespace detail
          однако "this->" у тебя иногда насильно затребует гцц
          http://govnokod.ru/8820#comment125273
          Ответить
          • По стандарту же.
            Ответить
            • Вот в том то и дело, что по стандарту
              Как я тогда показал в ссылке на ideone (http://ideone.com/VaMKR), можно добиваться очень неожиданных результатов.

              Логика этого правила понятна - когда я пишу шаблонную функцию t<...>() и использую в нем функцию f(), я знаю какую функцию f() я имею в виду, и компилятор обязан знать. В будущем, когда t будет инстанциирована, компилятор не позволит вызвать иную, более локально определенную, f().

              Но вот кое-кому было лень в это правило прописать другой подход, когда описывается метод класса, который сам наследуется от шаблонного класса - что, если у нас внезапно обнаружится отнаследованный подходящий метод f() у базового класса? Может стоит, все же, взять его? Более того, что, если глобально определенных функций с аналогичной сигнатурой даже нет? Гцц выдаст ошибку "поставь this->, дружок, или я так не играю". А вот студийному компилятору не сложно работать не по стандарту, а по здравому смыслу - если программист желает именно вызвать не_метод, ему будет не сложно написать ::f() (тем более, что это действительно редкий случай), в противном - не нужно его напрягать с this-> на каждый чих - ведь наследоваться от somebase<T> и использовать его методы приходится гораздо, гораздо, гораздо чаще.

              И кстати, clang в этом случае на стороне стандарта, т.е. gcc.
              Ответить
        • если уж так хочется явно показать, хотя не понятно зачем (функций класса обычно намного больше отдельных несистемных функций), то можно написать ::TestFunction();
          Хотя, вопрос спорный:)
          Ответить
    • Наконец-то скомпилировалось.
      Ответить
    • показать все, что скрытоvanished
      Ответить

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