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

    +22

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    class ClassA 
    {
    };
    class ClassB : private ClassA
    {
    public:
    	ClassA& AsClassA()
    	{
    		return *this;
    	}
    };

    Запостил: Setry, 19 Ноября 2012

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

    • По всему проекту автор избегает public наследования
      Ответить
    • Наследование тогда вообще не нужно
      class ClassA 
      {
      };
      
      class ClassB 
      {
        public: ClassA assClassA;
      };

      Да, я опять троллю ООПшников, в который раз видя, как они, продолжая свои светлые идеи, приходят к тому, чем и так занимаются процедуроструктурщики, и за что они этих процедурноструктурщиков застёбывали.
      Ответить
      • Да? Ахаха - давным-давно, когда деревья были большими, а я был простым студентом и думал что стану инженером электронщиком, а программирование было не работой, а увлечением, я почитывая литературу по программированию под винду часто натыкался на такой термин как handle, это была очень странная штука сперва ее надо было сгенерить,потом перекладывать в качестве параметра в разные функции, а потом специальной функцией закрыть. Как не странно, этот хендель в ашках окзывался всеголиш переопределенным тайпдефом/макросом обезличеным указателем типа void или еще чем-то подходящим для хранения адреса, и тут мне просто стало интересно - а на чтоже эта хрень указывает, но тогда я как-то это не прознал. Прошли годы, мой диплом инженера пылится в серванте, а мне как ни странно, пришлось на работе разбирать код одной библиотечки написанной на чистом си. Там тоже был хендл (обезличенный указатель), но когда я увидел исходники я Навернулся на темную сторону иронично улыбнулся.
        [trololo]
        Так что же такое хендл? Это как мастурбация, даже производное от слова рука - только обычно мастурбируют не имея возможности нормально трахатся, а хендлоблудничают не имея возможности нормального ооп.
        Как это же происходит? После прохождения пубертантного возраста, определенного количества написанного кода, поциент понимает что остро нуждается в в механизме позволяющем выполнять разнообразные действия с неким определенным набором данных.
        Ответить
        • Но если ООПшник нормально знакомится с девушкой и тащит в кровать создает обьект с нужными ему полями и алгоритмически наполняет методы этого обьекта. То процедурный онанист укрывается под одеяло и рукоблудничает за методом типа createHandle(), где сгорая от стыда, динамически выделяет кусочек памяти соответствующей структуре с нужными ему данными, далее в ручную (конструктора то нету), инициализирует ее поля, ведь выделил он просто кучу набитую незнамо чем. Далее адрес структуры передается наружу через ретурн или параметр типа двойной указатель ввиде обезлченного адреса шоб мама не спалила чтоб не поняли что там структура. Далее этот указатель передается другие сишные функции (эрзац сисек методов) написанные задротом, где адрес перекастовывается в "правильный тип", под занавес создается метод closeHandle(handle) часто состоящий только из одного вызова free(handle).
          Наметанный глаз терапевта, нормального программиста должен уловить тревожные симптомы! если вместо нормального создания обьекта вы увидете функцию возвращающую обезличенный адрес, если вместо вызова обьектов вы видете какието функции которые принимают этот адрес, а потом когда адрес больше не нужен нужно вызвать специальную функцию (ведь механизм деструкции не предусмотрен - все ручками - ручками, помыть не забудь после мастурбации), знайте этот человек тяжело болен онанизмом процедуризмом, он остро нуждается в девушке ООП. Но как и любой онанист/алкаш/наркоман никогда не признает этой пробемы, если вы ему не поможете. Ведь признайте что девушка нормальный обьект, гораздо приятнее руки Хендла.
          [/trololo]
          Ответить
          • Спорить с пастой смысла нет, но лично я вижу простой выход из этой ситуации: включать в хедер forward declaration структуры вроде struct window_handle; и предоставлять функции, порождающие, удаляющие, и манипулирующие указателями на такие структуры. Определения же структур помещать в *.c файле, рядом с определениями операций.

            Вот тебе АТД, инкапсуляция и раздельная компиляция без ООПшного выпендрёжа, поразившего неокрепший моск.
            Ответить
            • Алгебраические типы данных ты зачем приплел суда? В остальном согласен.
              Ответить
              • > Алгебраические типы данных
                Функциональное трололо?
                Абстрактные типы данных.
                Ответить
            • Так ООП онанисты так и делают, потвоему проблема только втом что есть обезличенный указатель? Да написать упреждающим определением что это структура = признать я нуждаюсь в обьектах, но не буду использовать С++, я всеравно буду писать на СИ!!!! Ну разве так плохо иметь нормальный механизм создания обьектов/удаление обьектов, разве плохо чтоб была настоящая ориентация в методах обьекта, а не в эрзацах. Я же молчу про интерфейсы виртуальные функции.
              Ответить
              • Ололо, люди, услышьте глас пророка! В C++, оказывается, есть НАСТОЯЩЕЕ ООП!
                Ответить
                • > Ололо, люди, услыште глас пророка! В C++, оказывается, есть НАСТОЯЩЕЕ ООП!
                  А посоны, пишущие на смолтолке, и не знали...
                  Ответить
                • Раз это так называют и пишут таким макаром много программ значит так оно и есть.
                  Ответить
                  • Когда все вокруг верят что Земля плоская - это тоже так и есть?
                    Ответить
                    • Ну зачем вы так? 21 век на дворе.
                      Ответить
                    • Откуда знаешь, что земля не плоская? Ты же из космоса на неё не смотрел.
                      Ответить
                      • Откуда ты знаешь про космос? Ты же там не был.
                        Ответить
                      • Ага, а космоса тоже нет. Ты же в него не летал. Тебе просто показали несколько снимков, искусно нарисованных художником, а ты поверил в существование космоса.
                        Ответить
                        • Фотошопа достаточно.
                          Фотошоп же есть, да?
                          Ответить
                          • А ты его купил? :)
                            Ответить
                            • Нет, товарищ майор, я пользуюсь гимпом, я - за свободный софт.
                              Ответить
                              • Мьсе знает толк в извращениях.
                                Ответить
              • А потом крестоонанист задумывается о том, как же его прекрасную либу, следующую всем крестоблядским канонам и заветам, использовать в проге, написанной на другом языке.

                То, что в сишке смотрелось как обезличенный хендл (да, да, вот она истинная инкапсуляция!) и пакет красиво названных функций для работы с ним, которые было так легко использовать почти в любом языке, превратились в сраное замангленное говнище в виде _ZN4Test4testEv, да еще и разное в разных компиляторах.

                И тогда крестоонанист начинает писать extern "C" и прочие непотребства с настройкой экспорта, чтобы хоть как-то экспортировать свои функции. Но на этом его кошмар не заканчивается... Ведь большинство FFI не умеют передавать нетривиальные объекты по значению.

                И тогда крестоонанист понимает, что есть области, в которых хендлы по-прежнему удобней крестоблядских объектов (апишки операционок, всяких низкоуровневых либ и т.п.), спивается, и рано или поздно умирает...
                Ответить
                • от смерти еще никто не уходил
                  и прыщавые крестоонанисты, и дельфишные альфа-программисты
                  все будут лежать в сырой землице-матушке
                  Ответить
                  • >все будут лежать в сырой землице-матушке
                    а может кого по ветру пустят, ну или там на дно морское, или в космос выстрелят из пушки...
                    Ответить
                • Вы так говорите, будто FFI это что-то плохое.
                  Ответить
                  • > Вы так говорите, будто FFI это что-то плохое.
                    Как можно было так превратно понять мой текст ;)

                    Я наоборот писал, что для работы с FFI крестомодель неудобна, и здесь свою нишу вполне законно занимают хендлы и их аналоги. Про то, что FFI это плохо я ни слова не сказал.
                    Ответить
                • >>>И тогда крестоонанист понимает, что есть области, в которых хендлы по-прежнему удобней крестоблядских объектов (апишки операционок, всяких низкоуровневых либ и т.п.), спивается, и рано или поздно умирает...

                  Но найдется пророк несверувший с пути истинного и тисячу оберток он напишет имитируя сишные вызовы, призовет древню мошь ассемблера в руки свои и напишет в чуждом компиляторе вставки из ассемблера как бы сам родной компилятор его исделал и познает он тайны соглашений вызовов и тысячу шишек набьет об них - но найдет просветление ибо на си переписывать это еще сложнее может быть.
                  Ответить
      • Здесь тарас прав, вместо приватного наследования лучше применять аггрегацию. По семантике они аналогичны, но аггрегация смотрится нагляднее.
        Ответить
        • Минусятор, а теперь покажи преимущества приватного наследования перед аггрегацией, или слив засчитан.
          Ответить
    • Мне вообще приватное наследование в плюсах кажется довольно спорной фичей. Если уж нужна аггрегация, почему бы явно не использовать вложенный объект, ведь явное лучше неявного?
      Ответить
      • В шарпике вот либо наследуешь, либо не наследуешь. Никаких модификаторов доступа. В жабе как с этим?
        p.s. а есть же еще и protected наследование в ++
        Ответить
        • > В жабе как с этим
          В шарпике также, как в жабе.

          > p.s. а есть же еще и protected наследование в ++
          А ещё и виртуальное и множественное
          Ответить
      • Интересно бы придумать пример... Скажем, есть класс CWidget, который вызывает всякие виртуальные обработчики onClick(), onPaint() и т.д..
        class FooEmulator : public IFoo,
          private CWidget // Пользователь не должен лезть в оконные дела - это детали реализации
        {
        public:
          // Здесь интерфейс
        private:
          //  поля, поля, поля...
        
          // CWidget 
        
          virtual void onPaint()
          {
            // А здесь я хочу писать код и пользоваться и полями объекта, и методами CWidget
          }
        }
        Ответить
        • Ну да, переопределение виртуальных методов. Других причин вроде бы не наблюдается.
          Ответить
          • Ну вот и с++ faq считает подобный пример единственным местом, где оно оправданно: http://www.parashift.com/c%2B%2B-faq-lite/priv-inherit-vs-compos.html
            Ответить
    • В продолжение темы
      class A
      {
      public:
              void f();
      };
      
      class B : private A
      {
      public:
              using A::f;
      };

      Ох не хочу я этим проектом заниматься
      Ответить
    • У ClassA нет виртального деструктора, поэтому AsClassA в потомке писать нельзя
      Ответить
      • > У ClassA нет виртального деструктора, поэтому AsClassA в потомке писать нельзя

        Сфига? Он же возвращает ссылку, и чтобы по ней вызвать delete надо еще постараться.
        ClassB b;
        test(b.AsClassA());
        Ответить

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