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

    +23

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    class ANameCreator
    {
    public:
                virtual void Create(const std::string& /*name*/)
                {
                    throw std::runtime_error("<ANameCreator::Create()> : abstract method stub call");
                }
    };

    Запостил: odeni, 06 Марта 2013

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

    • может в этом таки есть смысл?
      Ответить
      • Х.з. разумно бы объявить этот метод как pure virtual. Тогда о попытке вызова ANameCreator::Create() узнавали бы на этапе компиляции, а не в рантайме.

        P.S. Разве что автор очень любил вызывать виртуальные методы из конструкторов/деструкторов и по ночам ему снились pure virtual function call'ы, поэтому он написал код именно так, а также отловил и заглушил std::runtime_error вылетающий из этого метода, чтобы никто никогда не догадался о серьезном баге в программе, и о его неразделенной любви к вызову чего-попало из конструктора...
        Ответить
        • > Разве что автор очень любил вызывать виртуальные методы из конструкторов/деструкторов и по ночам ему снились pure virtual function call'ы

          А кресты сами не кинут исключение в этом случае? Я вроде читал, что должны.
          Ответить
          • Вызов pure virtual function - это UB. Свинья кресту не товарищ и кресты никому ничего не должны. Чтобы избежать UBогости, то для pure virtual function можно определить реализацию:
            struct T
            {
                virtual void pure_virtual_function(void)=0;    
            };
             
            void T::pure_virtual_function(void)
            {
                
            }
            http://ideone.com/YOZNow
            Ответить
            • Факен шит
              Ответить
              • А что вас смущает?
                virtual void pure_virtual_function(void)=0;
                Означает, что функцию pure_virtual_function обязательно должен переопределить наследник, это не означает, что у неё нет реализации. Так часто делают с виртуальными деструкторами.
                Ответить
            • Эта фишка не для того. Такую хрень, емнип, пишут чтобы не только заставить перекрыть этот метод в потомке (=0), но и предоставить ему какую-нибудь дефолтовую реализацию (в данном случае потомок может может вызвать T::pure_virtual_function()).

              Ну и есть такая идиома как pure virtual destructor, чтобы сделать класс, в котором ничего кроме этого деструктора нельзя объявить как pure virtual.

              А от аборта это не спасёт ;)
              Ответить
              • Потомков нужно спасать! Никаких абортов!
                Ответить
                • Спасем тонущий корабль: https://ideone.com/AMW0j6. Гцц онли, для визуалки нужен другой хак.

                  Pure-virtual с реализацией: https://ideone.com/YHynrS. Если раскомментить вызов test() в конструкторе - будет тоже самое, что и без реализации.
                  Ответить
                  • Как-то немного перекликается с чисто виртуальным деструктором, но в явной форме.
                    Ответить
              • Ты одновременно прав и не прав:
                http://ideone.com/feKEPO
                http://ideone.com/z3lxyE
                http://ideone.com/yk2nR5

                #include <iostream>
                 
                using namespace std;
                 
                struct T
                {
                    int a;
                    T():a(this->pure_virtual_function())
                    {
                        this->pure_virtual_function();
                    }
                    virtual int pure_virtual_function(void)=0;
                };
                 
                int T::pure_virtual_function(void)
                {
                    return 0;
                }
                 
                struct TT: T{int pure_virtual_function(void){return 0;}};
                 
                int main() {
                        TT t;
                        return 0;
                }
                И никакого аборта.
                Ответить
                • Да что ты с этим UB'ом возишься. UB он на то и UB, чтобы вызывать баттхерты:
                  https://ideone.com/d3u0JP
                  https://ideone.com/JJlbot

                  А грань достаточно тонка: http://ideone.com/D2gMSh. Причем этот случай с промежуточной функцией он как раз реалистичней. Специально никто не будет вызывать pure virtual из конструктора, а вот случайно, через другую функцию - запросто.
                  Ответить
                  • Жестко. Я думал, что создатели компиляторов стараются всегда UB одного класса решать одинаково.
                    Ответить
                    • Фишка в том, что промежуточная функция содержит настоящий виртуальный вызов (ведь ее потом может вызвать кто-то еще). Поэтому здесь мы получаем ошибку в рантайме.

                      А вот вызов виртуального метода из конструктора оптимизируется в прямой вызов (т.к. и так понятно что именно вызывается, зачем лишние разадресации?), поэтому здесь все работает. Кстати gcc выдает ворнинг pure virtual «virtual int T::pure_virtual_function()» called from constructor если вызвать pure virtual метод не выпендриваясь с вызовом через this.

                      P.S. Но в любом случае все это слишком сильно зависит от реализации, фазы луны и настроения компилятора. Поэтому не стоит вызывать виртуальный метод (или метод, способный его вызвать) из конструктора\деструктора. Даже если он не pure virtual, вызовется метод текущего класса или предков, но не потомка, а это скорее всего совсем не то, что хотели добиться...
                      Ответить
                      • Мне иногда кажется, что Борманд самый умный на говнокоде. Даже Diff eceistra делает по крестам или Романа по всему.
                        Ответить
                        • На деле у Романа и Дефекейта опыта всяко больше чем у меня. Просто здесь же далеко не весь спектр знаний можно разглядеть...

                          По низкому уровню (сишка, асм, алгоритмы, архитектура процов) да, у меня неплохая прошаренность. А вот опыта в проектировании архитектуры масштабных проектов мне очень не хватает (т.к. по работе с ними не сталкиваюсь, а для души, естественно, такое не пишут).

                          Кресты, как язык, я знаю неплохо. А вот в std и boost я практически полный ноль, т.к. кресты юзал по началу как "сишку с классами", а затем совместно с кутишкой, и из std знал только контейнеры, стримы, да десяток алгоритмов. Начал восполнять этот пробел, понемногу полистывая "The C++ Standard Library: A Tutorial and Reference".

                          Ну и по опыту жабоебства Роман, Лур и 3.14159265 меня запросто порвут, ибо мой жабопыт состоит из пары прог под J2ME, написанных лет 8 назад, подпиливания клиента Haven&Hearth и, с недавнего времени, пары программ под ведро - одной серьезной под заказ и одной игрушечной (говнотифи, которое ты наверное видел).
                          Ответить
                          • stl маленькая либа
                            а насчет буста - там немного библиотек, с нюансами которых надо знакомиться/набивать руку, обычно достаточно гугла "c++ boost whatever", чтобы за 10 минут найти исчерпывающую инфу по конкретной проблеме, либо понять, что в бусте-то этого нет

                            опыт набивается быстро, если есть интересный и не очень тривиальный проект - challenge

                            надо лишь менять место дислокации в более крупный город с бОльшими возможностями, а работу в нем ты найдешь без труда

                            кстати, удивлен ценами на квартиры в киеве - дешевле, чем даже в новосибирске
                            Ответить
                            • > stl маленькая либа
                              > а насчет буста - там немного библиотек
                              Вижу, что провоцируется крестосрач
                              Ответить
                              • > там немного библиотек, с нюансами которых надо знакомиться/набивать руку
                                Не вырываем из контекста, мистер Трололо.
                                Ответить
                              • ну а что такого непостижимого в stl?
                                там материала на методичку:
                                18 Language support library
                                19 Diagnostics library
                                20 General utilities library
                                21 Strings library
                                22 Localization library
                                23 Containers library
                                24 Iterators library
                                25 Algorithms library
                                26 Numerics library
                                27 Input/output library
                                28 Regular expressions library
                                29 Atomic operations library
                                30 Thread support library

                                в бусте же зачастую утилитарные строительные блоки, далеко не каждая первая там библиотека - фреймворк в себе, требующий навыка с ним, памяти о заботливо расставленных граблях
                                и да, я не хочу сказать, что я пользовался всеми библиотеками из буста, но большинство из тех, чем пользовался - просты в употреблении с первой ложки
                                Ответить
                        • Провоцируешь писькомерство, @LispGovno?!
                          Не надейся, никто не поведётся.

                          А поработать с бормандом в одной команде я бы не отказался.
                          Ответить
                          • Так что, @bormand, приезжай к нам в нижний, работой мы тебя обеспечим
                            Ответить
                            • Присоединяюсь!
                              Ответить
                              • >Присоединяюсь!
                                К @bormand'у?
                                Ответить
                                • К предложению @Романа . Работа у нас интересная, условия вкусные, крутые специалисты ценятся.
                                  Ответить
                                  • Говнокод.ру
                                    Тут помогут с работой

                                    А HaskellGovno возьмете?
                                    Ответить
                                    • >А HaskellGovno возьмете?
                                      А почему тебя это интересует? Не отвечай сразу. Пускай аноны выдвинут несколько теорий. Я их развею, а ты подтвердишь.
                                      Ответить
                          • > Не надейся, никто не поведётся.
                            ЛиспГовно открыл мне глаза... Раньше я не понимал этого, и считал себя обычным человеком... Но теперь я осознал, что я - Великий и Всемогущий Борманд, представитель расы Избранных, затмевающий облака и солнце подошвами своих сапог. А вы все ничтожные и глупые муравьи, которых я уничтожу вместе с вашей никому не нужной планетёнкой. [зловещий смех]Му-ха-ха-ха...[/зловеший смех]
                            Ответить
                            • А если серьёзно, собеседование обеспечить можно без проблем.
                              Только вот Нижний по сравнению с СПБ - большая деревня, а цены на новое жильё как в Москве. Погода, правда, в среднем лучше.
                              Ответить
                              • > А если серьёзно, собеседование обеспечить можно без проблем.
                                Спасибо, добавлю НН в список потенциальных городов.
                                Ответить
                              • ну судя по http://www.domostroynn.ru/search.html (первая попавшаяся ссылка на гугл "новостройки нижний новгород") всё же не как в москве
                                я бы вот не отказался, если бы в москве такие цены были, например
                                Ответить
                              • Про «как в Москве» ты что-то загнул всё-таки.
                                Ответить
                                • В центре до сотни с лишним за квадрат доходит, но с Москвой я действительно погорячился.
                                  Ответить
                            • Чего-то не хватает... Ах да, зеленого.
                              Ответить
                          • Я бы Борманда взял к себе в штаты, кроме шуток. Но в нашей деревне программисты н***й никому не нужны и крестушки реально программируют за еду. Рядом ко ко со мной сидит скотрудник C++\CLI\C# с 2мя годами или даже больше стажа и получает чуть больше 8к.р. :(
                            Та и у меня не намного больше (лишь в 2 раза). Хотя я лишь крестушок. Если скажу, что немного знаю Haskell то меня просто закрестушат.
                            Ответить
                            • Странная штатовская деревня в которой зарплату дают едой и рублями ;)
                              Ответить
                            • это в каких местах такое рабство?
                              скажи, чтобы я туда не вздумал поехать
                              Ответить
                            • http://www.youtube.com/watch?v=a9U_C_q6WcU
                              Ответить
                          • Борманд очень позитивный и трудолюбивый парень. Разбирается сходу со всем. Я бы даже не отказался узнать его имя отчество, чтобы называть его уважительно.
                            Ответить
                            • Борманд, самая главная книга по программированию, что ты знаешь и которую нужно обязательно прочитать? Может какие-то ещё книги? Как ты вообще готовишь себя к великим свершениям в программировании? У тебя есть планы или мечты? Как думаешь, чем обусловлен твой высокий уровень подготовленности? Какая-то система подготовки?
                              Ответить
                              • Почитай "совершенный код" Макконнелла, если еще не читал.

                                Фундаментальное по алгоритмам/структурам данных - читал лет 10 назад Кнута и Вирта, не читал, но слышал хорошие отзывы о книгах Ахо и Кормена.

                                Насчет многопоточности - хорошая книга Java concurrency in practice. Она хоть и жабья, но многие принципы, описанные там, вполне универсальны.

                                По крестам могу предложить интересную книжку с уклоном в практику - Imperfect C++.
                                Ответить
          • Согласно стандарту это UB: Member functions can be called from a constructor (or destructor) of an abstract class; the effect of making a virtual call (10.3) to a pure virtual function directly or indirectly for the object being created (or destroyed) from such a constructor (or destructor) is undefined. Поэтому исключение не гарантируется, и, в большинстве случаев, прога просто делает харакири.

            Прога, скомпиленная gcc, в такой ситуации вызывает __cxa_pure_virtual которая сразу же делает аборт. В вижуалке, если я правильно понимаю доку (не тестил), можно засунуть свой обработчик при помощи _set_purecall_handler, но по дефолту тоже аборт.
            Ответить
      • Видимо, автор имел длительные отношения с Java или C#, где такие вещи зачастую генерируются средой.

        Но плюсую: это хардкор даже в качестве дебаг-инструмента.
        Ответить
        • >автор имел длительные отношения с Java или C#

          >abstract method
          Похоже на то.
          Ответить
        • Это где это генерируется?
          Ответить
    • Abstract method is term, that proposed by MS or Sun. Abstract class is correct, but not abstract method. Recommended use term pure virtual method.
      Ответить

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