- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
#include <cstdio>
class A
{
public:
void sayHello()
{
printf("Hello!");
}
};
int main(int argc, char **argv)
{
A *a = 0;
a->sayHello();
return 0;
}
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+145
#include <cstdio>
class A
{
public:
void sayHello()
{
printf("Hello!");
}
};
int main(int argc, char **argv)
{
A *a = 0;
a->sayHello();
return 0;
}
Что выведет этот код?
myaut 29.05.2015 16:29 # +4
Stertor 29.05.2015 17:36 # −2
без краша выводит строку "hello". Когда писал этот код, ожидал увидеть краш, но его не было. Как это возможно? Под объект не выделена память, фактически его нет.
inkanus-gray 29.05.2015 18:28 # +5
this/self в языках программирования с ООП используется для указания на хранилище полей объекта и на таблицу виртуальных методов, которая содержит (сюрприз!) указатели на виртуальные методы.
Невиртуальные методы — это костыль. Фактически это самые обычные процедуры/функции с несколькими отличиями:
1. Для их наименований используется отдельное пространство (TA.SayHello отличается от SayHello, объявленной вне класса).
2. В них передаётся N+1 аргумент. «Лишний» аргумент — это тот самый указатель this/self.
3. При объявлении такого метода можно использовать синтаксический сахар типа inherited для вызова метода из родительского класса.
Если нет доступа к полям объекта, к свойствам (properties) и к виртуальным методам, то инициализировать объект нет необходимости. Но тогда это уже не ООП, а обычное процедурное программирование, только записанное извращённым способом.
Stertor 29.05.2015 18:31 # −1
Кстати. Что посоветуешь почитать о внутреннем строении делфей? Или системное что-нибудь.
inkanus-gray 29.05.2015 18:38 # +1
Поскольку метод TA.SayHello не обращается ни к полям, ни к свойствам, ни к виртуальным методам, то значение переменной a нигде не используется.
Stertor 29.05.2015 18:41 # 0
inkanus-gray 29.05.2015 18:57 # +2
Даже портировал модули от Bormand Pascal 7.0 на Delphi 1.0 (единственный 16-битный компилятор Делфей), чтобы компилировать программы для DOS'а с использованием новой объектной модели (та, что описывается магическим словом class).
Самое страшное, что мне удалось портировать с BP 7.0 на Delphi 1.0 модуль Graph для вывода графики (при том, что у него не было исходников). Потом я наткнулся на 32-битные DOS-экстендеры и прикрутил к 32-битным Делфям библиотеку BGI32.DLL (или как там её звали?) от Борманд Си. Но это уже из другой оперы, не относящейся к ООП...
А ещё однажды пришлось допиливать извращатель OBJ-файлов, чтобы можно было линковать в одну программу OBJ-файлы, сгенерированные разными компиляторами. Что-то я разошёлся...
Короче, начни с изучения исходников стандартных библиотек. Они же открытые.
Stertor 29.05.2015 19:02 # −2
3_14dar 30.05.2015 01:20 # +1
Stertor 30.05.2015 19:33 # −1
3_14dar 31.05.2015 01:03 # 0
Любой язык кроме си и асма
> и визуальщины.
Сишарп/кое-что еще.
Stertor 31.05.2015 10:43 # −1
Можно было бы поучить - так, ради интереса, но в качестве постоянного самотыка этот язык непригоден.
bormand 31.05.2015 11:57 # +1
Так какого хрена ты тогда сидишь на винде, автор которой... Майкрософт?
Stertor 31.05.2015 12:04 # +1
bormand 31.05.2015 13:39 # +1
Stertor 31.05.2015 13:53 # +1
kegdan 31.05.2015 14:00 # +1
Логично. Лучше - хуже - абстрактные понятия. Все решается человеком за клавиатурой. Если человек больше обезьян - любой язык говно
>> производительность кода низкая
Опять твои влажные фантазии? Грамотный код на шарпе вкусен и скор
>> К тому же наличие "сборщика мусора", на мой взгляд, развращает
А это да, я на плюсах (точнее на си-с-классами) не могу писать от того, что не приучен к RAII и программы у меня текут
>> Да и среда разработки ебанутая, интуитивно в ней не разобраться
Ну покажи мне IDE лучше чем VS
Stertor 31.05.2015 14:07 # −1
kegdan 31.05.2015 14:12 # 0
3_14dar 31.05.2015 20:35 # −1
kegdan 31.05.2015 21:36 # 0
3_14dar 31.05.2015 22:16 # 0
И нет, это не тот, который ты имеешь в виду, там всего 512 памяти.
Vasiliy 01.06.2015 11:18 # 0
А Вами баба командует.
1024-- 01.06.2015 11:24 # 0
1024-- 31.05.2015 14:01 # +2
+1
Подтверждаю. После разработки бекенда ЭКМАСКРИПТом на C++ было сложно возвращаться. Правда, немецкий сборщик мусора позволяет более просто писать код в функциональном стиле и не думать о последствиях.
3_14dar 31.05.2015 20:35 # 0
СБОРЩИК МУСОРА. Тебя уже здесь тыкали в твои косяки с освобождением памяти, т.е. несмотря на свою любовь к делфям ты ее кажется так и не осилил. а там это не нужно, ну или гораздо проще.
>не перенесёт свои вредные привычки на другой язык?
Дак почти все языки с ГЦ.
kegdan 31.05.2015 14:15 # 0
Stertor 31.05.2015 14:23 # +1
kegdan 31.05.2015 14:26 # 0
В противном случае не строй из себя девственницу.
Stertor 31.05.2015 14:30 # −1
1024-- 31.05.2015 14:30 # +2
Кстати да, немного понимаю Стертора. У меня от M$ только винда, скайп да пара программ. Я не ненавижу их программы, просто MPCHC и Chrome оказались удобнее, а брать пиратский офис или платить за него, когда (1) ты не бухгалтер и (2) есть свободный аналог - верх идиотизма.
kegdan 31.05.2015 14:34 # 0
Мне нравиться винда и VS, но остальные проги от MS мне не доставляют
Кстати скайп совсем запаршивел(
1024-- 31.05.2015 14:37 # 0
Это да, печаль. Айфонные облачка и полуметровые смайлы на весь экран на десктопе. Фу.
kegdan 31.05.2015 14:39 # 0
Stertor 31.05.2015 14:42 # −1
Узнаю стиль мелкософтовцев.
1024-- 31.05.2015 14:48 # 0
> гнать по черному
А, да. Статусы теперь рандомные какие-то. Статус "отошёл" теперь значит "отошёл", "разбил телефон молотком", "сейчас в Америке", "выключил компьютер две недели назад" или "давно помер, уже год как похоронили".
Но облачка - не фигня. Ни черта не видно же. С бОльшим размером букв можно отобразить больше информации, если нормально подойти к проектированию гуя. Блджад, в соседних программах шрифт в полтора раза больше, и помещается в два раза больше!
То есть я должен напрягать глаза ради того, чтобы прочесть пять комментариев, когда в нормальных программах легко читаю десять. Это победа над логикой.
kegdan 31.05.2015 14:51 # 0
1024-- 31.05.2015 14:54 # 0
kegdan 31.05.2015 14:57 # 0
1024-- 31.05.2015 15:01 # 0
bormand 31.05.2015 15:07 # +2
+1. Я туда раз в полгода захожу зачем-то на пару минут, даже стену не читаю.
P.S. Надо им предложить, чтобы рисовали на страничках таких юзеров мох и паутину.
1024-- 31.05.2015 15:10 # +1
Интересная идея. Предложите, может хотя бы на первое апреля сделают.
kegdan 31.05.2015 16:25 # 0
3_14dar 31.05.2015 20:37 # 0
kegdan 31.05.2015 13:34 # +1
А пруфы будут, или это твое авторитетное мнение как погромиста?
bormand 31.05.2015 13:45 # +2
Слишком прост и быстро приедается. Вот c++ можно юзать в качестве постоянного самотыка. Каждый день новые ощущения.
kegdan 31.05.2015 13:48 # +1
Хотя самотык... Стретор... Делфи...
Stertor 31.05.2015 14:29 # −1
kegdan 31.05.2015 16:27 # 0
А с# - быстро сделал дело - и на боковую
Stertor 31.05.2015 16:54 # −1
Иди на хуй, Кегги.
kegdan 31.05.2015 16:56 # 0
Stertor 31.05.2015 16:58 # −1
kegdan 31.05.2015 03:39 # 0
Черепашка что ли?
Stertor 31.05.2015 10:41 # −1
codemonkey 29.05.2015 16:31 # 0
myaut 29.05.2015 16:35 # 0
inkanus-gray 29.05.2015 19:00 # 0
absolut 29.05.2015 21:26 # 0
класс же
>Должно быть std::printf,
хедеры вида <csomething> не убирают глобальные сишные функции, а всего лишь дополнительно вносят их в пространство std. Т.е. в данном случае std::printf и printf одно и то же.
inkanus-gray 29.05.2015 16:49 # +3
Вообще советую погуглить говнокоды, в обсуждении которых встречался термин ТВМ или VMT.
guest 29.05.2015 20:02 # +1
http://stackoverflow.com/questions/2474018/when-does-invoking-a-member-function-on-a-null-instance-result-in-undefined-behav
inkanus-gray 29.05.2015 20:25 # 0
“However, because E1 is not used in a static member-function call, if we use the weak interpretation the call is well-defined. *(E1) results in an lvalue, the static function is resolved, *(E1) is discarded, and the function is called. There is no lvalue-to-rvalue conversion, so there's no undefined behavior.”
Так всё же кому верить: адептам weak или адептам strict?
bormand 29.05.2015 21:03 # 0
TarasB 01.06.2015 13:10 # 0
inkanus-gray 01.06.2015 15:00 # 0
kegdan 01.06.2015 15:56 # +2
Соблюдайте грамматику говнокода