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

    +172

    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
    template<class face>
    face getFace(face)
    {
    	static face _face;
    	return _face;
    };
    
    template<class face>
    face* getFace(face*)
    {
    	static face _face;
    	return &_face;
    };
    
    template<char className>
    struct SimpleFace
    {
    	void printMe()
    	{
    		cout<<"ClassName is "<< className<<endl;
    	};
    };
    
    template<class face, char className>
    struct TrollFace : public SimpleFace<className>
    {
    	face operator->() const
    	{
    		return getFace(face());
    	};
    };
    
    typedef SimpleFace<'H'> H;
    struct G: public TrollFace< H, 'G'>{};
    struct F: public TrollFace< G, 'F'>{};
    struct E: public TrollFace< F*, 'E'>{};
    struct D: public TrollFace< E*, 'D'>{};
    struct C: public TrollFace< D*, 'C'>{};
    struct B: public TrollFace< C, 'B'>{};
    struct A: public TrollFace< B, 'A'>{};
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	A a;
    	a.printMe();
    	a->printMe();

    На днях, мой знакомый задал мне вопрос (видимо, решил меня потроллить):
    "Что будет выведено на экран при запуске данной программы?"
    Этот вопрос ему задали при собеседовании в одну серьёзную фирму. Естественно, пользоваться компилятором запрещено.

    Запостил: Говногость, 07 Июля 2011

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

    • Как на таком извращенском языке вообще можно что-то написать? Это будет не письмо программы, а разгадывание загадок стандарта. Тупой язык.
      Ответить
    • ClassName is A
      ClassName is B
      Версия не компилировал.
      Ответить
    • >"Что будет выведено на экран при запуске данной программы?"
      неужели это?
                                                                  
                       .:+osyhhhhhyyyyhhhhyyoooooo+oshy:            
                .+sssoo/:-...---://:--..--:----     .od:          
             `ods-  .``-::-----:-`  `....-://:::--`   -my         
             sy`   .:-.` ``/-      .-       `--/:-..   .mo        
            .N:    `        :      ` `:+ossso/. ` `     .mo       
          `sm/   ```sdhdmdy/-      +ds/-:MMMMNhh:`..   `.-dm/               
         +No///.````:/+oosymNho   `hdsyyo/+o::+o/`.//ooo+-.-oho`  
         .Mo/--oyyss/``-    .M       ``    `ohso+oydh+/:.:sy``.+m` 
        `Ms : ` .o.yys/  .ods      ./:.`      ``  `:smm:  +h - do 
         od+.- `hN    `-hMh     `:/+/:M-.... `:ohdy/..Myy:sy - m+ 
          om:-.yNNh/`.. .`+y::: -/::-os.:+syhyody  -oNh   +`/-hh  
           yd  NMhsmhhyo+/::sy/:/+osyyyNy-`  .oMNdydM+    .:yd:   
           .M. NMsdy oN-://My/:-mo`    sdoydNNyNs om-     od:     
            M- mMMMMNNNdhyyMhyyyNdyyhmMNNdo/.  smmo      +d`      
           `M. oNmMNMMMMMMMMMMMMNNds+:. yy   :yms.      +m`       
           :N   ddN/hh-hd.-yN``  yo     `mhydy:       /ds`        
           oh    +hhdMyoMy::N+--:hd+oshddy+----:+//+sho`          
           ho ``  -  .-:/+ooooooo//:-.``--:+::/++yh+.             
           m/  -` `::--.````.````..-:///---:oyyo-                 
           m+   .:---....```........`  :oyy/.                     
           .hs.                .:osssss/.                         
             -syyo+/////+ossssso+/:.`                             
                 .-:::::-.`
      Ответить
    • Хорошо что в классах B и С ничего не объявлено, ато пострадали бы от мэмори слайсинга при неявном вызове конструкторов копирования, игры с мэмбер аксес оператором неуместные, ну и модификатор доступа паблик совершенно лишний (структуры же по умлолчанию паблик).

      Годный говнокод :толлфэйс:
      Ответить
      • tallface???? выскоое лицо?? льстите себе :D
        Ответить
      • public тут - тип наследования, а не модификатор доступа.
        ~ Матчасть 12.2.5
        Ответить
        • Всё равно паблик по умолчанию. Но всё равно его лучше написать :D
          Ответить
          • по умолчанию при наследовании - private
            Ответить
            • Тип наследования по умолчанию - public
              члены класса(методы, атрибуты) - private
              *facepalm*
              Ответить
              • >Тип наследования по умолчанию - public
                хоть стандарт что ли почитай...
                Ответить
                • ANSI ISO IEC 14882 2003

                  Если класс объявлен как базовый для другого класса со спецификатором доступа public, тогда public члены базового класса доступны как public члены производного класса, protected члены базового класса доступны как protected члены производного класса.

                  Если класс объявлен как базовый для другого класса со спецификатором доступа protected, тогда public и protected члены базового класса доступны как protected члены производного класса.

                  Если класс объявлен как базовый для другого класса со спецификатором доступа private, тогда public и protected члены базового класса доступны как private члены производного класса.

                  \ANSI ISO IEC 14882 2003

                  если короче:
                  class Derived : /*public*/ Base
                  {
                  /*private:*/
                     int member;
                     void method();
                  };


                  Мы поняли друг друга?)
                  Ответить
                  • > public тут - тип наследования, а не модификатор доступа.
                    > Если класс объявлен как базовый для другого класса со спецификатором доступа public...

                    Вам не кажется что эти два утверждения противоречат друг другу?
                    Ответить
    • показать все, что скрытоПравильный ответ: будет ошибка при компиляции: - лишняя ";" после определения тела функций getFace (face) и getFace (face *)
      Ответить
      • Ошибок при компиляции здесь нет. Проверил в MSVS2010
        Ответить
        • А <iostream>-то незаинклюжен )
          Ответить
          • а ещё скобки закрывающей нет. Чем в только серьёзной фирме думают?
            Ответить
            • И using nemespace std; нет, ага. Может там больше кода было. Неужели всё на говнокод постить? Соль же нужна.
              Ответить
        • Если Ваша программа скомпилировалась без ошибок, обратитесь к системному программисту, что бы он исправил ошибки в компиляторе.
          Это известная истина, такая же тривиальная, как и то, что вижуал - говно.
          Ответить
        • /*
          http://www.comeaucomputing.com/tryitout

          Your Comeau C/C++ test results are as follows:

          Comeau C/C++ 4.3.10.1 (Oct 6 2008 11:28:09) for ONLINE_EVALUATION_BETA2
          Copyright 1988-2008 Comeau Computing. All rights reserved.
          MODE:strict errors C++ C++0x_extensions

          "ComeauTest.c", line 9: error: extra ";" ignored,
          In C: A function definition does not end with a semicolon
          In C++: A non-member function definition, extern "C" block,
          or namespace does not end with a semicolon
          };
          ^

          "ComeauTest.c", line 16: error: extra ";" ignored,
          In C: A function definition does not end with a semicolon
          In C++: A non-member function definition, extern "C" block,
          or namespace does not end with a semicolon
          };
          ^

          2 errors detected in the compilation of "ComeauTest.c".

          */
          Ответить
        • /*
          $g++ -Wall -Wextra -pedantic test.cpp
          test.cpp:140: error: extra ‘;’
          test.cpp:146: error: extra ‘;
          $g++ -v
          Using built-in specs.
          Target: i586-suse-linux
          Configured with: ../configure --enable-threads=posix --prefix=/usr --with-local-prefix=/usr/local --infodir=/usr/share/info --mandir=/usr/share/man --libdir=/usr/lib --libexecdir=/usr/lib --enable-languages=c,c++,objc,fortran,obj-c++,java,ada --enable-checking=release --with-gxx-include-dir=/usr/include/c++/4.1.2 --enable-ssp --disable-libssp --disable-libgcj --with-slibdir=/lib --with-system-zlib --enable-shared --enable-__cxa_atexit --enable-libstdcxx-allocator=new --program-suffix=-4.1 --enable-version-specific-runtime-libs --without-system-libunwind --with-cpu=generic --host=i586-suse-linux
          Thread model: posix
          gcc version 4.1.2 20061115 (prerelease) (SUSE Linux)

          */
          /*
          >bcc32 -w test.cpp
          Embarcadero C++ 6.30 for Win32 Copyright (c) 1993-2010 Embarcadero Technologies, Inc.
          test.cpp:
          Error E2028 test.cpp 184: operator-> must return a pointer or a class
          Error E2029 test.cpp 191: 'TrollFace<H,71>' must be a previously defined class or struct
          Error E2028 test.cpp 184: operator-> must return a pointer or a class
          Error E2029 test.cpp 192: 'TrollFace<G,70>' must be a previously defined class or struct
          *** 4 errors in Compile ***
          */z
          Ответить
          • >bcc32 -w test.cpp
            >Embarcadero C++ 6.30 for Win32 Copyright (c) 1993-2010 Embarcadero Technologies, Inc.
            test.cpp:
            >Error E2028 test.cpp 184: operator-> must return a pointer or a class

            Бывший борланд как всегда отличился по не соответствию стандарту! Хахах. :D
            Ответить
          • g++ ошибок не нашёл? Туплю. Нашёл только при указании спец ключей.
            Ответить
    • Достойное задание для поступления в серьёзную фирму на знание стандарта С++.
      Ответить
      • По моему с таким же результатом серьезная фирма могла бы проверять знание приоритетов булевых операторов.
        Ответить
      • Задание на базовые представления о наследовании, умение продираться сквозь чащу "рекурсии" на шаблонах и понимание работы оператора "стрелочка". Если последние две вещи там настолько нужны, то нужна ли такая работа?
        Ответить
        • ну да, я бы тоже усомнился.
          честно сказать, все по отдельности я понимаю, но в такой мешанине - чуть что-то не заметишь и... в общем копаться не стал.
          Код не должен быть таким, особенно когда его мегабайты.
          Ответить
    • classname is A
      classname is H
      не угадал?
      Ответить
      • нет
        Ответить
        • A
          B
          ?
          Ответить
          • Та же ошибка что и у меня. Думай над operator->
            Ответить
            • Я не знаю, сдаюсь.
              Ответить
              • A
                D
                Ответить
                • А
                  D
                  -ский код!
                  Ответить
                • Кстати, вы приняты.
                  Ответить
                  • Не сказано, что это собеседование состоит лишь из одного вопроса. Скорее всего это простейший базовый вопрос, поэтому были и другие и наверняка более вырвиглазые. Так что может ещё и не приняты.
                    Ответить
                  • Во чувак попал! :D
                    Ответить
                • Почему?
                  Ответить
                  • У страуструпа найти не могу, в стандарте лень : ( Держи вики

                    http://en.wikibooks.org/wiki/C++_Programming/Operators/Operator_Overloading#Member_access_opera tors
                    Втрой абзац.
                    Ответить
                    • Что такое -> я знаю, если что.

                      Короче, там берётся D, потому что в его объявлении есть указатель?
                      Ответить
                      • Читай внимательнее. Компилятор будет его вызывать много раз пока указатель не получит в качестве возвращаемого значения.
                        Ответить
                        • не знал, спасибо.
                          Ответить
                          • Вот сколько не программирую на С++ - всё узнаю что-то новое...
                            Ответить
                      • Если к объекту применить operator->, то оператор -> будет применяться к каждому объекту, возвращаемому этим оператором -> каждый раз, пока не будет возращен обычный указатель на объект, а не какой-то там промежуточный proxy-объект.

                        Полезно для создания proxy-объектов и умничающих умный указателей (мы то знаем, что все они достаточно глупые :D).

                        То есть ситуация такова, что proxy-объект может вернуть прокси-объект, который уже наконец-то вернёт нужный нам объект, ну или хотя бы прокси-объект, который... Весьма полезное свойство языка С++.
                        Ответить
                  • по компилятору
                    Ответить
              • зря тебя позвали.
                Тарас уже не торт.
                Ответить
    • Мне вот интересно, TrollFace - это класс из оригинального кода?
      Ответить
    • Кстати, кто знает, в С++0x лямбда-функция без замыкания (без захвата локальных переменных) "[](params...)->void{}" должна автоматически приводится в указатель на функцию по стандарту С++?
      Ответить
      • Не вникал в новый стандарт, но, насколько я понимаю, не должна.
        Ответить
    • Хм. Может это приём на работу в серьёзную фирму по производству компиляторов С++?
      Ответить
    • Если такое задают при собеседовании, можно предположить, что в этой серьёзной фирме пишут такие же еле-читаемые лесенки запутанного говнокода, только потому что шаблоны это мегакрутааа
      Ответить
      • возможно, уже написали, а теперь ищут того, кто разгребёт
        Ответить
        • Требуется навык чтения чужого кода. Классика жанра.
          Ответить
          • fixed: "навык чтения чужого говнокода."

            Хорошо, правильно написанный код приятно читать и на с++, и даже на перле -- без особых кулхацкер-познаний всех параграфов стандарта.

            Алсо, для таких запущенных случаев заведено понятие "комментарий". Почему не проверяют навык чтения чужих комментариев?
            Ответить
            • навык написания важнее навыка чтения
              Ответить
            • > без особых кулхацкер-познаний всех параграфов стандарта.

              Если только стандарта, то это ещё ничего, а если ещё и недокументированные особенности конкретного крестокомпилятора...
              Ответить
              • Да вы то откуда знаете?
                http://www.gamedev.ru/flame/forum/?id=147416
                Учите с++!
                Ответить
                • TarasB Постоялец www «» 12 мая 2011 14:19 #0
                  Есть много удобных языков программирования таких как Delphi, Modula, Oberon, Ada. Но почему-то некоторые программисты выбирают C++. Я никогда всерьёз не писал на нём, но где-то слышал мнение, что C++ это язык для понтующихся школьников, что программы, написанные на нём, глючат и текут, итд.

                  TarasB
                  Блииин, я забыл отписаться от уведомлений на почту!!!!

                  TarasB
                  Ещё ОБЛОМ сей и сиплюсплюса.
                  Вот тут говорят, что якобы к машине близко. Ага, к машине образца 70го года.
                  А в современной машине многое не так. Важное изменение - память дико тормозная нынче. Понимаете? Все эти сраные сишные указатели - это большая проблема. Да, компиляторы это вроде как разруливают, но тогда не надо ляля про "близок к машине".

                  Вот например, как я могу передать число в функцию так, чтобы оно поменялось после работы функции? В сях для этого придуман указатель. А указатель - это пипец скорости, переменную не положить в регистр, это постоянное разыменование, это обращение к памяти. В крестах придумали ссылку - так это тупо сахар для указателя. А в нормальных языках есть модификатор in out, который вообще может не иметь никакого отношения к указателям, переменная может прийти в функцию в регистре, и уйти из неё в нём же.

                  А, ну да, можно же функцию в виде макроса записать, как я мог забыть. Какое удобное, мать его, решение, вместо того, чтобы придумать нормальный синтаксис вызова функции.
                  Ответить
                • TarasB
                  ололо
                  А чего ж так? А как же "близко к железу"?
                  Даже ребёнку достаточно одного взгляда на картинку, чтобы увидеть, что тот же CL - и тот намного, в разы, ближе к железу, чем C:
                  http://www.gamedev.ru/files/images/66384_1303576956_screen.png
                  Ответить
                • TarasB
                  Петушок, заткни клюв.
                  Но миллионы леммингов всё равно выбирают С++.
                  Извини, но твой интеллектуальный уровень недостаточен для этой дискуссии.
                  Э, народ, давайте поговорим (не холиварим) не про мелкие недостатки Дельфи, а про уродства С++.
                  ДЫ ТЫ ЧЁ, РИАЛЬНА?!

                  TarasB
                  Спасибо, что просветил меня!
                  Теперь я буду знать, что С++ позволяет оптимизировать вплоть до ассемблера!
                  Ты забыл дописать "только" и "другие языки так не могут, потому что они ламерские, а С++ так может, потому что он ][a(kerский"

                  VIP_Artemka
                  Есть в Delphi одно преимущество: это процедура beep() =) или я просто не знаю аналога в C++
                  Ответить
                • TarasB
                  Учись, как элементы из массива надо удалять, я для детей специально статью написал:
                  http://forum.pascal.net.ru/index.php?showtopic=26642
                  Ответить
                • TarasB
                  Ай не надо, маленький врунишка.
                  > почитай Александреску, посмотри как использует шаблоны он
                  Это тот чел, который, после того, как изучил до конца недокументированные возможности С++, понял, что С++ - говно? Кстати, шаблоны так, как он, в промышленности никто не использует.
                  Ну и понятное дело, что для того, чтобы считать факториал на этапе компиляции, шаблоны не нужны, нужен просто компилятор, который догадается заменить fact(5) на 120.
                  Ответить
            • Как сообщает нам /lm/,

              Настоящее значение фразы
              * Нужен идиот, который будет разгребать это дерьмо.
              Ответить
        • ммм, видимо, один из их сотрудников наговнокодил и по каким-то причинам(ну нам-то известно по каким ^_^ )уже не числится в конторе, и теперь они действительно
          >ищут того, кто разгребёт
          я бы сказал - лопатой раскидает :D
          Ответить
      • Это я должен обсирать шаблоны, а не ты!
        Ответить
    • Я всегда мечтал о том, чтобы пользоваться компьютером было не труднее, чем телефоном. Эта мечта сбылась. Теперь я не знаю, как пользоваться телефоном.

      » Бьёрн Страуструп
      Ответить
    • показать все, что скрытоvanished
      Ответить

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