- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 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();
На днях, мой знакомый задал мне вопрос (видимо, решил меня потроллить):
"Что будет выведено на экран при запуске данной программы?"
Этот вопрос ему задали при собеседовании в одну серьёзную фирму. Естественно, пользоваться компилятором запрещено.
ClassName is B
Версия не компилировал.
http://trollface.biz/trollface-ascii-art Use Google, Luke
Всю задницу уже отсидел. :(
осиххиххиоооооо схи
Годный говнокод :толлфэйс:
~ Матчасть 12.2.5
члены класса(методы, атрибуты) - private
*facepalm*
хоть стандарт что ли почитай...
Если класс объявлен как базовый для другого класса со спецификатором доступа public, тогда public члены базового класса доступны как public члены производного класса, protected члены базового класса доступны как protected члены производного класса.
Если класс объявлен как базовый для другого класса со спецификатором доступа protected, тогда public и protected члены базового класса доступны как protected члены производного класса.
Если класс объявлен как базовый для другого класса со спецификатором доступа private, тогда public и protected члены базового класса доступны как private члены производного класса.
\ANSI ISO IEC 14882 2003
если короче:
Мы поняли друг друга?)
> Если класс объявлен как базовый для другого класса со спецификатором доступа public...
Вам не кажется что эти два утверждения противоречат друг другу?
Это известная истина, такая же тривиальная, как и то, что вижуал - говно.
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
>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
честно сказать, все по отдельности я понимаю, но в такой мешанине - чуть что-то не заметишь и... в общем копаться не стал.
Код не должен быть таким, особенно когда его мегабайты.
classname is H
не угадал?
B
?
D
D
-ский код!
http://en.wikibooks.org/wiki/C++_Programming/Operators/Operator_Overloading#Member_access_opera tors
Втрой абзац.
Короче, там берётся D, потому что в его объявлении есть указатель?
Полезно для создания proxy-объектов и умничающих умный указателей (мы то знаем, что все они достаточно глупые :D).
То есть ситуация такова, что proxy-объект может вернуть прокси-объект, который уже наконец-то вернёт нужный нам объект, ну или хотя бы прокси-объект, который... Весьма полезное свойство языка С++.
Тарас уже не торт.
Хорошо, правильно написанный код приятно читать и на с++, и даже на перле -- без особых кулхацкер-познаний всех параграфов стандарта.
Алсо, для таких запущенных случаев заведено понятие "комментарий". Почему не проверяют навык чтения чужих комментариев?
Если только стандарта, то это ещё ничего, а если ещё и недокументированные особенности конкретного крестокомпилятора...
Есть много удобных языков программирования таких как Delphi, Modula, Oberon, Ada. Но почему-то некоторые программисты выбирают C++. Я никогда всерьёз не писал на нём, но где-то слышал мнение, что C++ это язык для понтующихся школьников, что программы, написанные на нём, глючат и текут, итд.
TarasB
Блииин, я забыл отписаться от уведомлений на почту!!!!
TarasB
Ещё ОБЛОМ сей и сиплюсплюса.
Вот тут говорят, что якобы к машине близко. Ага, к машине образца 70го года.
А в современной машине многое не так. Важное изменение - память дико тормозная нынче. Понимаете? Все эти сраные сишные указатели - это большая проблема. Да, компиляторы это вроде как разруливают, но тогда не надо ляля про "близок к машине".
Вот например, как я могу передать число в функцию так, чтобы оно поменялось после работы функции? В сях для этого придуман указатель. А указатель - это пипец скорости, переменную не положить в регистр, это постоянное разыменование, это обращение к памяти. В крестах придумали ссылку - так это тупо сахар для указателя. А в нормальных языках есть модификатор in out, который вообще может не иметь никакого отношения к указателям, переменная может прийти в функцию в регистре, и уйти из неё в нём же.
А, ну да, можно же функцию в виде макроса записать, как я мог забыть. Какое удобное, мать его, решение, вместо того, чтобы придумать нормальный синтаксис вызова функции.
ололо
А чего ж так? А как же "близко к железу"?
Даже ребёнку достаточно одного взгляда на картинку, чтобы увидеть, что тот же CL - и тот намного, в разы, ближе к железу, чем C:
Петушок, заткни клюв.
Но миллионы леммингов всё равно выбирают С++.
Извини, но твой интеллектуальный уровень недостаточен для этой дискуссии.
Э, народ, давайте поговорим (не холиварим) не про мелкие недостатки Дельфи, а про уродства С++.
ДЫ ТЫ ЧЁ, РИАЛЬНА?!
TarasB
Спасибо, что просветил меня!
Теперь я буду знать, что С++ позволяет оптимизировать вплоть до ассемблера!
Ты забыл дописать "только" и "другие языки так не могут, потому что они ламерские, а С++ так может, потому что он ][a(kerский"
VIP_Artemka
Есть в Delphi одно преимущество: это процедура beep() =) или я просто не знаю аналога в C++
Учись, как элементы из массива надо удалять, я для детей специально статью написал:
Ай не надо, маленький врунишка.
> почитай Александреску, посмотри как использует шаблоны он
Это тот чел, который, после того, как изучил до конца недокументированные возможности С++, понял, что С++ - говно? Кстати, шаблоны так, как он, в промышленности никто не использует.
Ну и понятное дело, что для того, чтобы считать факториал на этапе компиляции, шаблоны не нужны, нужен просто компилятор, который догадается заменить fact(5) на 120.
Настоящее значение фразы
* Нужен идиот, который будет разгребать это дерьмо.
>ищут того, кто разгребёт
я бы сказал - лопатой раскидает :D
» Бьёрн Страуструп