- 1
#define private public
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+890.7
#define private public
Это можно поставить в один ряд с #define TRUE FASLE
Это стандартный прием для того, чтобы получить доступ к приватным членам класса без наследования. Часто помогает бороться с заприваченным говнокодом.
>Это стандартный прием для того, чтобы получить доступ к приватным членам класса без наследования.
Это и есть говнокод, дубина
а рефлексии какой-нибудь в C++ нет?
а не в рантайме работающий
и скажи, сраный дикер, зачем ты вырыл мой коммент времен Шумерской Республики?
в рантайме работает непосредственно без компиляции.
[quote=Говногость] #2 Говногость (6 часов назад)
Это НЕ говнокод.
Это стандартный прием для того, чтобы получить доступ к приватным членам класса без наследования. Часто помогает бороться с заприваченным говнокодом. [/quote]
"стандартный прием" на самом деле противоречит стандарту, т.к. ломает ODR.
это именно говнокод.
[quote=страйко]а рефлексии какой-нибудь в C++ нет?[/quote]
Никакой рефлексии в С++ нет.
Тема данного говнокода раскрыта у Herb Sutter [url]http://www.gotw.ca/gotw/076.htm[/url] - здесь или в его книге Exceptional C++ Style.
Каким образом оно ломает ODR?
[quote=_zerg]
Каким образом оно ломает ODR? [/quote]
Достаточно включения в единицу трансляции, где директивы #define private public нет. В случае "чужого кода" такая единица уже имеется.
Хоть последствия UB не обсуждаются, тут можно попробовать представить себе, что будет, если компилятор групирует члены-данные по области видимости, или если порядок баз зависит от типа наследования.
Буду краток, писец ))
Попахивает диверсией. О_о
вот диверсия:
#define CRASH_SOMETIMES 10/(rand()%10)
это не говнокод, а костыль для тупых либ.
Человек знал, что писал (хотя и выглядит криво, но иногда иначе никак, если надо запатчить приват).
Этот код действительно используется как минимум в двух случаях:
1) Чужие либы с недостаточным интерфейсом.
2) При написании unit-тестов.
Лучше всего использовать так:
// Только для зарегистрированных
XDDD
Надо:
#define private public
// включить чужой кривой интерфейс и что то с ним сделать
#undef private
Из другой оперы, но похожее - имеем:
#pragma pack(push,1)
struct A{...}
не забываем
#pragma pack(pop)
после объявления необходимо-упакованных структур