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

0

  1. 1
#define private public

Запостил: guest guest, (Updated )

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

  • Cryptochild:
    Это можно поставить в один ряд с #define TRUE FASLE
    Ответить
  • Это НЕ говнокод.
    Это стандартный прием для того, чтобы получить доступ к приватным членам класса без наследования. Часто помогает бороться с заприваченным говнокодом.
    Ответить
    • >Это НЕ говнокод.
      >Это стандартный прием для того, чтобы получить доступ к приватным членам класса без наследования.

      Это и есть говнокод, дубина
      Ответить
  • страйко:
    а рефлексии какой-нибудь в C++ нет?
    Ответить
        • ващето это сурс-ту-сурс компайлер
          а не в рантайме работающий

          и скажи, сраный дикер, зачем ты вырыл мой коммент времен Шумерской Республики?
          Ответить
          • Еще скажи, что изначальный
            #define private public

            в рантайме работает непосредственно без компиляции.
            Ответить
  • Alexander G:
    [quote=Говногость] #2 Говногость (6 часов назад)
    Это НЕ говнокод.
    Это стандартный прием для того, чтобы получить доступ к приватным членам класса без наследования. Часто помогает бороться с заприваченным говнокодом. [/quote]
    "стандартный прием" на самом деле противоречит стандарту, т.к. ломает ODR.

    это именно говнокод.
    Ответить
  • Alexander G:
    [quote=страйко]а рефлексии какой-нибудь в C++ нет?[/quote]
    Никакой рефлексии в С++ нет.

    Тема данного говнокода раскрыта у Herb Sutter [url]http://www.gotw.ca/gotw/076.htm[/url] - здесь или в его книге Exceptional C++ Style.
    Ответить
  • Alexander G:
    [quote=_zerg]
    Каким образом оно ломает ODR? [/quote]
    Достаточно включения в единицу трансляции, где директивы #define private public нет. В случае "чужого кода" такая единица уже имеется.
    Хоть последствия UB не обсуждаются, тут можно попробовать представить себе, что будет, если компилятор групирует члены-данные по области видимости, или если порядок баз зависит от типа наследования.
    Ответить
  • Ja!:
    это не говнокод, а костыль для тупых либ.
    Человек знал, что писал (хотя и выглядит криво, но иногда иначе никак, если надо запатчить приват).
    Ответить
  • AlekSi:
    Этот код действительно используется как минимум в двух случаях:
    1) Чужие либы с недостаточным интерфейсом.
    2) При написании unit-тестов.

    Лучше всего использовать так:
    // нужно для unit-тестов
    #define private public
    #include <mylib.h>
    #undef private
    Ответить
  • А мне нравится. Точно у себя в проэкте использую для Unit Test'ов. %D
    Ответить
  • Антипаттерн под названием "public Morozov". Применим только в случае крайней мудаковатости сисархитектора.
    Ответить
  • #undef private забыл
    Надо:
    #define private public
    // включить чужой кривой интерфейс и что то с ним сделать
    #undef private

    Из другой оперы, но похожее - имеем:
    #pragma pack(push,1)
    struct A{...}
    не забываем
    #pragma pack(pop)
    после объявления необходимо-упакованных структур
    Ответить

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

Где здесь C++, guest?!

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


    8