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

    +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
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    class CBaseEntity {
    
            // ...
    
    	void (CBaseEntity ::*m_pfnThink)(void);
    
    	virtual void Think( void ) { if (m_pfnThink) (this->*m_pfnThink)(); };
    
            // ...
    
    	// Ugly code to lookup all functions to make sure they are exported when set.
    
    #ifdef _DEBUG
    	void FunctionCheck( void *pFunction, char *name ) 
    	{ 
    		if (pFunction && !NAME_FOR_FUNCTION((uint32)pFunction) )
    			ALERT( at_error, "No EXPORT: %s:%s (%08lx)\n", STRING(pev->classname), name, (uint32)pFunction );
    	}
    
    	BASEPTR ThinkSet( BASEPTR func, char *name ) 
    	{ 
    		m_pfnThink = func; 
    		FunctionCheck( (void *)*((int *)((char *)this + ( offsetof(CBaseEntity,m_pfnThink)))), name ); 
    		return func;
    	}
    
            // ...
    
    };
    
    // Ugly technique to override base member functions
    // Normally it's illegal to cast a pointer to a member function of a derived class to a pointer to a 
    // member function of a base class.  static_cast is a sleezy way around that problem.
    
    #ifdef _DEBUG
    
    #define SetThink( a ) ThinkSet( static_cast <void (CBaseEntity::*)(void)> (a), #a )
    
    // ...
    
    #else
    
    #define SetThink( a ) m_pfnThink = static_cast <void (CBaseEntity::*)(void)> (a)
    
    // ...
    
    #endif

    https://github.com/ValveSoftware/halflife/blob/5d761709a31ce1e71488f2668321de05f791b405/dlls/cbase.h

    > it's illegal
    В крестах всё легально, главное - попросить прощения в комментах...

    Запостил: bormand, 05 Ноября 2015

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

    • P.S. Интересно всё-таки, а почему стандартизаторы решили запретить каст указателей на члены класса в указатели на члены базового класса? Из-за множественного наследования?
      Ответить
      • Да, скорее всего запретили именно из-за питушни с несовместимыми this, которая вылезет при множественном наследовании.

        Ну и косвенный вызов метода ребёнка с this'ом от родителя смотрится странновато, даже если наследование не множественное...
        Ответить
        • указатели на невиртуальные члены разных классов должны отличаться по значению.
          Да и зачем кастить?:
          http://ideone.com/LLLk3C

          п.с. какой тут тэг для линка?
          Ответить
          • Никакой, мудачье делает его сине-подчеркнутым с помощью юзерскриптов, нормальным людям похуй.
            Ответить
            • Никакой, мудачье делает его сине-подчеркнутым с помощью юзерскриптов, нормальные люди пишут тэги руками.
              Ответить
              • У нормальных людей небось скобки не надо набирать с altgr. Но раскладку переключать все равно надо.
                Ответить
                • Беда. А программировать как?

                  Кстати, в 1С-то, оказывается, та же беда:
                  > Выборка = Результат[1].Выбрать();
                  > | 0 КАК ЛимитСрок
                  > Если СтрДлина(Комментарий) < 11 Тогда
                  Только вот всякие питоносишки разрабатывали для американцев и тех, у кого раскладки похожие, а 1С - как раз для тех, у кого "[", "]", "<", ">" и "|" нет.

                  Предлагаю улучшить 1С и каждую переменную именовать, начиная с "$".
                  Ответить
                  • Немецкая раскладка для программирования сверхебанутая. Вот не знаю что делать.
                    Ответить
                    • найти на свалке русскую клавиатуру.
                      Ответить
                      • Как я на русской клавиатуре программировать-то буду?
                        Ответить
                        • Вот как, блядь, нужно программировать, вот, быстро. Раз-раз-раз-раз-раз!
                          Ответить
                        • 1с и мс офис не предлагать.
                          Ответить
                    • У немецкой же ещё Z где-то не там?
                      Ответить
                      • Это самая маленькая из проблем. Поставь раскладку, если интересно, загугли клавиатуру и попробуй.
                        Ответить
                        • Ёбаный пиздец... Как вы с такими клавами живёте?

                          > самая маленькая из проблем
                          Ну не скажи. Мне при слепой печати пиздец как мешать будет. Я минут через 10 уже психанул бы поди :)
                          Ответить
                          • Посмотрел немецкую раскладку, посмотрел русскую. С немецкой я могу писать на сишке, только значки и буквы немного не там. В русской несколько символов вообще нет. Как вы с такими клавами живёте?
                            Ответить
                            • Дык русская раскладка не портит латинскую, а просто рядом нарисована! А тут получается, что латинскую раскладку извратили. И оригинальная латиница даже не нарисована на клавах.
                              Ответить
                              • Но немецкая раскладка - надмножество латинской. Теоретически немцы могут спокойно жить только с их раскладкой (и с русской для визитов на ГК).
                                Ответить
                                • Если они не программисты... Квадратные и фигурные скобки набираются как
                                  altgr + 7 {
                                  altgr + 0 }
                                  altgr + 8 [
                                  altgr + 9 ]

                                  Видимо питон придумал немец, чтобы не писать { }.
                                  Ответить
                                  • Зато все скобки рядом. Для полного счастья надо только левый и правый Alt поменять.
                                    Ответить
                                    • >Зато все скобки рядом.
                                      И набираешь их левой рукой, держа правую на altgr.
                                      Ответить
                                  • питон придумал не немец
                                    Ответить
                                • Практически тоже, только программировать неудобно. Плюс некоторые старые игры воспринимают именно английскую раскладку вне зависимости от системной.
                                  Ответить
                          • Все что в правом нижнем углу набирается через altgr. Мы это кто? Если немцы - им программировать не надо, если программисты - а вот хз. Кстати, проверь как работает ´ и ^.

                            Итого: через altgr (альт справа) набирается |[]{}\~€@. Программируйте на здоровье.

                            > самая маленькая из проблем
                            ОК, самая маленькая из проблем для тех кто пользуется ей больше хотя бы года
                            Ответить
                            • > Кстати, проверь как работает ´ и ^.
                              Хм, ` (которая у нас на ё) со второго раза срабатывает и превращается в ^. В чём фишка? Это какая-то эскейп-последовательность для редких символов.

                              З.Ы. Ага, хвостики какие-то дорисовывает у всяких j.

                              ĵjĴJ
                              Ответить
                              • Это хуита для французских символов, типа èê. Нахуя это на немецкой клавиатуре - нейбу. Весело было в ку3 где клавиша где ё коншоль открывала.
                                Ответить
                          • немцы спокойно кодят на родной раскладке... Я тоже очень долго бесился, что у них на всех рабочих станциях привычной английской раскладки нет, а кое где клавы с напечатанной англ. раскладкой. Итого ты даже не знаешь как набирать большинство спец символов, причем! с учетом авторизации по мейлу, очень много времени уходит на банальное "как набрать @?!"
                            Ответить
                            • Я нифига не понял. При логине же должна стоять родная раскладка?
                              Ответить
                              • Там как настроишь. Меня вот бесит, что в русской винде там получается русская раскладка по-дефолту. И её надо постоянно переключать, пока всё-таки не найдёшь место, где это делается раз и навсегда.
                                Ответить
                              • Установлена то родная. А на клавиатурах кое-где напечатана только английская.
                                Ответить
                          • я как-то на шведской раскладке кодил
                            первое время мне приходилось где-то раз в пять минут закрывать глаза и считать до 30, чтобы не разнести клавиатуру
                            потом подобное повторилось в чуть меньших масштабах, когда переучивался в обратную сторону
                            Ответить
                        • А еще у немцев капс действует на цифры (в свое время мне грозился поставить двойку препод по информатике за то что я не знал что в английском он не действует)
                          Ответить
                          • Есть раскладки и для русского, в которых капс действует на цифры. Например, так называемая раскладка печатной машинки (потому что на настоящих машинках защёлка верхнего регистра сдвигает все молоточки). Но в России такая раскладка не стала основной (потому что Микрософт по умолчанию предлагает другую).
                            Ответить
                            • Знать бы, откуда вообще взялась winkeys-раскладка.
                              Ответить
          • > Да и зачем кастить?
            Ну для удобства. Методы, которые в SetThink передают, они же только в дочернем классе есть. А хочется их в коллбек засунуть, причём этот коллбек дёргает база...

            Да на самом деле, можно заворачивать всё это в какой-нибудь std::function или его аналог и не париться... А если совсем критично по пирфомансу - кастомный аллокатор с пулом поможет.
            Ответить
            • База дергает невиртуальный метод класса по указателю на функцию? Мы точно в 21-м веке живем?
              Ответить
              • Ну этот класс сам захотел, чтобы эту конкретную функцию дёргали. Я почему и пишу про std::function<void ()> m_think. А база или какой-то вообще левый класс - тогда уже пофигу.
                Ответить
            • В hlsdk нет нигде std вообще.
              М.б. с этим проблемы были в середине 90x
              Ответить
              • > М.б. с этим проблемы были
                И ещё какие... В Qt тоже всё своё мутили по тем же самым причинам...
                Ответить
    • Ответить
    • Бог простит, ибо он милостив.
      Ответить
    • > FunctionCheck( (void *)*((int *)((char *)this + ( offsetof(CBaseEntity,m_pfnThink)))), name );
      Указатели кастовали-кастовали, да не выкастовывали.
      Ответить
    • Потому что надо писать на коффе++. Он удобный как coffe script, и быстрый как java script, но компилируется в С++:

      http://javascript.ru/forum/offtopic/59326-coffee-rozhdenie-legendy.html
      Ответить

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