1. C++ / Говнокод #119

    +890.7

    1. 1
    #define private public

    Запостил: guest, 12 Декабря 2008

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

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

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

            и скажи, сраный дикер, зачем ты вырыл мой коммент времен Шумерской Республики?
            Ответить
            • Еще скажи, что изначальный
              #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.
      Ответить
    • _zerg:
      Каким образом оно ломает ODR?
      Ответить
    • Alexander G:
      [quote=_zerg]
      Каким образом оно ломает ODR? [/quote]
      Достаточно включения в единицу трансляции, где директивы #define private public нет. В случае "чужого кода" такая единица уже имеется.
      Хоть последствия UB не обсуждаются, тут можно попробовать представить себе, что будет, если компилятор групирует члены-данные по области видимости, или если порядок баз зависит от типа наследования.
      Ответить
    • test:
      Буду краток, писец ))
      Ответить
    • Sat:
      Попахивает диверсией. О_о
      Ответить
    • Vito:
      вот диверсия:

      #define CRASH_SOMETIMES 10/(rand()%10)
      Ответить
    • Ja!:
      это не говнокод, а костыль для тупых либ.
      Человек знал, что писал (хотя и выглядит криво, но иногда иначе никак, если надо запатчить приват).
      Ответить
    • AlekSi:
      Этот код действительно используется как минимум в двух случаях:
      1) Чужие либы с недостаточным интерфейсом.
      2) При написании unit-тестов.

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

      XDDD
      Ответить
    • Я твой код define шатал!
      Ответить
    • не смешно
      Ответить
    • #undef private забыл
      Надо:
      #define private public
      // включить чужой кривой интерфейс и что то с ним сделать
      #undef private

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

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