Кресты / Говнокод #7204 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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();

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

Запостил: Говногость Говногость, (Updated )

Комментарии (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 и С ничего не объявлено, ато пострадали бы от мэмори слайсинга при неявном вызове конструкторов копирования, игры с мэмбер аксес оператором неуместные, ну и модификатор доступа паблик совершенно лишний (структуры же по умлолчанию паблик).

    Годный говнокод :толлфэйс:
    Ответить
    • public тут - тип наследования, а не модификатор доступа.
      ~ Матчасть 12.2.5
      Ответить
      • Всё равно паблик по умолчанию. Но всё равно его лучше написать 😀
        Ответить
          • Тип наследования по умолчанию - 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
      Ответить
        • а ещё скобки закрывающей нет. Чем в только серьёзной фирме думают?
          Ответить
          • И 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

          Бывший борланд как всегда отличился по не соответствию стандарту! Хахах. 😀
          Ответить
        • g++ ошибок не нашёл? Туплю. Нашёл только при указании спец ключей.
          Ответить
  • Достойное задание для поступления в серьёзную фирму на знание стандарта С++.
    Ответить
    • По моему с таким же результатом серьезная фирма могла бы проверять знание приоритетов булевых операторов.
      Ответить
    • Задание на базовые представления о наследовании, умение продираться сквозь чащу "рекурсии" на шаблонах и понимание работы оператора "стрелочка". Если последние две вещи там настолько нужны, то нужна ли такая работа?
      Ответить
      • ну да, я бы тоже усомнился.
        честно сказать, все по отдельности я понимаю, но в такой мешанине - чуть что-то не заметишь и... в общем копаться не стал.
        Код не должен быть таким, особенно когда его мегабайты.
        Ответить
                • Не сказано, что это собеседование состоит лишь из одного вопроса. Скорее всего это простейший базовый вопрос, поэтому были и другие и наверняка более вырвиглазые. Так что может ещё и не приняты.
                  Ответить
                  • Что такое -> я знаю, если что.

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

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

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

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

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

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

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

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

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

                А, ну да, можно же функцию в виде макроса записать, как я мог забыть. Какое удобное, мать его, решение, вместо того, чтобы придумать нормальный синтаксис вызова функции.
                Ответить
              • TarasB
                Петушок, заткни клюв.
                Но миллионы леммингов всё равно выбирают С++.
                Извини, но твой интеллектуальный уровень недостаточен для этой дискуссии.
                Э, народ, давайте поговорим (не холиварим) не про мелкие недостатки Дельфи, а про уродства С++.
                ДЫ ТЫ ЧЁ, РИАЛЬНА?!

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

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

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

    » Бьёрн Страуструп
    Ответить
  • т.Z?L)P.E:X Q.H,N!H(A,U!J!G:S(X:W$T(K V)M$E,S!H.U(Z:J:H:D)S VZ.N!U,Y.B?F)Z?N,OM$J(HUJ(W O"W,Y.S(Z(T C:L G.F.D W(J!T$X"MP,Q:GS)V(E!H"D?Y!SO.I?B.R.SJ:T$L:J,A:J.J(K(C$W!R"P,M$M(G,K AY G"C(R"Z?I!Q,P.T.T"T)F:M,F(E)Y!I N"SL:I.K(U)X!ID!BS,O?C$U.S(A?G)U F K!WP"M,R$GPH!U!F?D Q:J,E,T$G"K$I,W"Q!N"B?K?I!S)EG:Y N!HS"F?P:NA$H:BL?I.AL(Q$B,L)S$GN.Y$S)P$F R:G(H E$V,A"N?E)J)H!K!F,WD?S:NTO)S?W QI?F"X.B.H!Q(D:O)X!RG$Y C(Q,V.M B L Z L W$T P(Q?P,P E,H:B!V!K:L,Y!L$N,A,J"R(O"U,V!XB(Y"X S$M"R"C:V?JT"JT$D:H!I!U"P!N)X$Z.N.E.U"Q,E,J P!G.HY:E,Z(I P?T?T?O?S R D.Y(Q)N.M:BD$X?L:C?G N:Q)D?NQ!K J MZ J:Z Z BD.OR(Z.T!F:V$F$J$F!H.A:K!K,D!M,C)U"FW"Q!Q!A"C,S"XQ,R,B)I,W(W(Q$V(K.F)FS?L.QM)I"JC?B,A:J"E?Y)S(C$E:H$I)DP U!B(V.V A,P!K:W(G(L.UZC(J:R)U:O:H!V Q"H!B!C?J.V!S,I?D!N)P$S:I(C"Q:J"D"T,U?B?I$F$E)G,V:C(L?N!T(Y:I.F?J$T.R"S,R!G,Z,DF,S(S.X?Z(U:C?B.M:Z!G(O:U:W"O:S$V?I(P?W)G.X K:M$H!L,A,L$H)K.R!W.T)UX(E,E)Q.C.Q)Z.Q"R:I:Q:Y"P.G(J)Y!X(M:D)M.AU?L W!X!E?X?T(ZZ)Y"O!L!H.R"K?Q:P$C?E(U?IT$FP,V.Y)G.A(M D:C!U.J:KZ G,A!R(U,X"K.N,X:M)K.D.E.EF.B,U:V.C"C(J"T$Y.U H"H!A"Z(DY(T:M$Y)I"C?D"X"RK?Q?A:T!D.Z"P$B E(R.X"X F,Z?M(KA)L(K)M.H?R,Z"X,T?R.N D?J)I!A(C,V(D C)F"M:G)H(U J:C(D?T!W)T(S(Z.I.M?X:O$Q.C(Y Y"G:VJ(B$M!G,D(Y?N!OM?H$QHG!RV:F,K:V.O"M,P)B!LZ:GZQ(Y?K)I"S)L?Q.X,F!V Q$Q.N.F!Y?V!K(S BV$D!A$G S(D)M:YE)WJG$O?E"U!C OH)B!K?ZP C!P.A)S K)G C,P(P?R)P.I"O A V(C!E:V?Y$D$W)T:G?W!L$Q.O,GK(P$X"E$Q?P$K K"K)C E:Y)C,B$B!J$G?R"E$A.V$H$C$Y"B)X,J)FJ,K)A,K"P,K)G$VN?S R!X E?C,M"C Y.V!S,Q(U,W$T"Y:D,I?Z?L!Y?I"G,V(D:J(T"S,M,A,X(A,D)B(U Z X!K W)R(MЩAQNPDCHMNZMQMJVVUYZGNIYUFKGDPHBFFXYNNOHYODJDPHKOQBQKPZIIJXOPDQLJETOVPUQKMMRTBRONTPEGUMWDFQDJCJLDYZMIQZICHFTCPXUXRUUHQTWUYUMPOUYSKHMFDIBRVIRSZLPMVHIJQAOCWAAIYNEOGXZAICNQGFMHKPZXVVBPHLVFJSODNJFNJOTXGEZNVDKNOFJUDQBFAAPLRDYPHPKPMYXEHUNULLGPOEAPQEZCDUVIMQXNOAPDTIFZBALVWISBQZPCGUUVVPLUSHMTOYSSPHYQNNPH
    Ответить

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

Я, guest, находясь в здравом уме и твердой памяти, торжественно заявляю:

    А не использовать ли нам bbcode?


    8